使用LinkedList實現安全佇列
使用 wait notify 實現一個佇列,佇列有2個方法,add 和 get 。add方法往佇列中新增元素,get方法往佇列中獲得元素。佇列必須是執行緒安全的。如果get執行時,佇列為空,執行緒必須阻塞等待,直到有佇列有資料。如果add時,佇列已經滿,則add執行緒要等待,直到佇列有空閒空間。
/** * 使用LinkedList實現安全佇列 * */ public class SafeLinkedList<E> { private LinkedList<E> data = new LinkedList<>(); private int totalSize; public SafeLinkedList(int totalSize) { this.totalSize = totalSize; } /** * 當佇列已滿時候,阻塞,直到取走資料為止 * @param e */ public void add(E e) { synchronized (data) { if (data.size() == totalSize) { try { data.wait(); } catch (InterruptedException e1) { Thread.interrupted(); data.notifyAll(); System.out.println("佇列已滿啦!"); } } data.add(e); data.notifyAll(); } } /** * 當佇列為空時候,阻塞等待 * @return */ public E get() { synchronized (data) { if (data.isEmpty()) { try { data.wait(); } catch (InterruptedException e) { Thread.interrupted(); data.notifyAll(); } } E e = data.getFirst();//獲取佇列頭元素 data.removeFirst();//移除對頭元素 data.notifyAll(); return e; } } public synchronized int size() { return data.size(); } }
測試佇列:
/** * 多執行緒條件下測試LinkedList存取資料是否安全 */ public class SafeLinkedListTest { private SafeLinkedList<String> data = new SafeLinkedList<>(10); @Test public void putGetTest() throws InterruptedException { //add test Thread t1 = new Thread(new OperAddThread()); Thread t2 = new Thread(new OperAddThread()); Thread t3 = new Thread(new OperAddThread()); Thread getThread = new Thread(new OperGetThread()); getThread.setName("getThread"); t1.start(); t2.start(); t3.start(); getThread.start(); t1.join(); t2.join(); t3.join(); getThread.join(); System.out.println(data.size()); } class OperAddThread implements Runnable { @Override public void run() { for (int i = 0; i < 4; i++) { String addData=Thread.currentThread().getName()+"|"+String.valueOf(i); data.add(addData); System.out.println("add size=" + data.size()); System.out.println(Thread.currentThread().getName() + " addData=" + addData); } } } class OperGetThread implements Runnable { @Override public void run() { int i=11; while (i>=0) { i--; String value = data.get(); System.out.println("get size=" + data.size()); System.out.println("get string--" + " ;value=" + value); } } } }
相關文章
- 執行緒安全佇列(使用互斥鎖進行實現)執行緒佇列
- Python實現執行緒安全佇列Python執行緒佇列
- 使用 RabbitMQ 實現延時佇列MQ佇列
- 使用陣列實現環形佇列Scala版本陣列佇列
- linux核心--使用核心佇列實現ringbufferLinux佇列
- 使用RabbitMq原生實現延遲佇列MQ佇列
- 使用Spring Boot實現訊息佇列Spring Boot佇列
- GCD之佇列的實現和使用GC佇列
- 通過佇列實現棧OR通過棧實現佇列佇列
- 佇列的一種實現:迴圈佇列佇列
- Python佇列的三種佇列實現方法Python佇列
- ArrayDeque雙端佇列 使用&實現原理分析佇列
- 9. 題目:對佇列實現棧&用棧實現佇列佇列
- 用佇列實現棧佇列
- 用 Rust 實現佇列Rust佇列
- 佇列(Queue)-c實現佇列
- 用棧實現佇列佇列
- Go中使用Redis實現訊息佇列教程GoRedis佇列
- Redis使用ZSET實現訊息佇列使用總結一Redis佇列
- Redis使用ZSET實現訊息佇列使用總結二Redis佇列
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- 鏈式佇列—用連結串列來實現佇列佇列
- Day 10| 232.用棧實現佇列 、 225. 用佇列實現棧佇列
- 兩個棧實現佇列佇列
- RabbitMQ 實現延遲佇列MQ佇列
- Redis實現訊息佇列Redis佇列
- RabbitMQ實現延遲佇列MQ佇列
- 【資料結構】佇列(順序佇列、鏈佇列)的JAVA程式碼實現資料結構佇列Java
- Laravel5.6使用redis佇列實現系統通知LaravelRedis佇列
- 效能優化-使用雙buffer實現無鎖佇列優化佇列
- 使用db-scheduler實現高效能持久佇列佇列
- LinkedList實現原理
- 靜態佇列,迴圈陣列實現佇列陣列
- 什麼是阻塞佇列?如何使用阻塞佇列來實現生產者-消費者模型?佇列模型
- 實現簡單延遲佇列和分散式延遲佇列佇列分散式
- 兩個棧實現佇列操作佇列
- 用JavaScript實現棧與佇列JavaScript佇列
- 四、佇列的概念和實現佇列
- Python實現堆疊與佇列Python佇列