java.util.concurrent.BlockingQueue 接口表明了線程安全的隊列。
java
一個BlockingQueue的典型使用是一個線程不斷生產對象往隊列裏放,另外一個線程往隊列裏取對象進行消費。
安全
生產線程會保持一致產生新的對象而且插入到隊列中,直到隊列到達了它的存儲上限,生產線程再往隊列插入時會發現阻塞,而且一直保持阻塞直到消費線程從隊列中取出一個對象。this
消費線程會保持從隊列中取出對象而且進行處理,若是消費線程試圖從一個空的隊列中取出對象,那麼消費線程將會阻塞直到生產線程往隊列中放入了新的對象。spa
BlockingQueue由4中不一樣的方法來添加,刪除和檢測。每組方法有不一樣的特色泳衣知足不能當即執行響應請求的操做。
線程
操做 | 拋出異常 | 返回操做結果 | 阻塞 | 超時 |
插入 | add(o) | offer(o) | put(o) | offer(o,timeout,timeunit) |
刪除 | remove(o) | poll(o) | take(o) | poll(timeout,timeunit) |
檢測element(o) | peek(o) |
1.拋出異常:若是對應方法沒有當即執行則拋出異常。code
2.返回操做結果:若是對應方法當即執行返回true,不然則返回false(超出隊列容量)。對象
3.阻塞:若是對應方法沒法當即執行,則將阻塞等待直到方法完成。接口
4.超時:若是對應方法沒法當即執行,則會一直等待但不超過給定的超時範圍,返回相應的結果。隊列
ArrayBlockingQueue
element
DelayQueue
LinkedBlockingDeque
PriorityBlockingQueue
SynchronousQueue
// 文章開頭生產與消費的示例 public class BlockingQueueExample { public static void main(String[] args) throws Exception { BlockingQueue queue = new ArrayBlockingQueue(1024); Producer producer = new Producer(queue); Consumer consumer = new Consumer(queue); new Thread(producer).start(); new Thread(consumer).start(); Thread.sleep(4000); } } // 生產者 public class Producer implements Runnable{ protected BlockingQueue queue = null; public Producer(BlockingQueue queue) { this.queue = queue; } public void run() { try { queue.put("1"); Thread.sleep(1000); queue.put("2"); Thread.sleep(1000); queue.put("3"); } catch (InterruptedException e) { e.printStackTrace(); } } } // 消費者 public class Consumer implements Runnable{ protected BlockingQueue queue = null; public Consumer(BlockingQueue queue) { this.queue = queue; } public void run() { try { System.out.println(queue.take()); System.out.println(queue.take()); System.out.println(queue.take()); } catch (InterruptedException e) { e.printStackTrace(); } } }