BlockingQueue是一種特殊的Queue。在加元素時,若空間不夠,能夠阻塞至空間知足;在取元素時,若空間爲0,能夠阻塞至有元素。
BlockingQueue通常用於消費者-生產者模型,它是線程安全的,即多個線程去操做BlockingQueue,有原子操做或者鎖機制保證操做過程不會出錯。java
//使用BlockingQueue的生產者-消費者模型 //相對於Linux下的模型,BlockingQueue接口封裝了具體實現 //使得使用起來很是方便 class Producer implements Runnable { private final BlockingQueue queue; Producer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { queue.put(produce()); } } catch (InterruptedException ex) { ... handle ...} } Object produce() { ... } } class Consumer implements Runnable { private final BlockingQueue queue; Consumer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { consume(queue.take()); } } catch (InterruptedException ex) { ... handle ...} } void consume(Object x) { ... } } class Setup { void main() { BlockingQueue q = new SomeQueueImplementation(); Producer p = new Producer(q); Consumer c1 = new Consumer(q); Consumer c2 = new Consumer(q); new Thread(p).start(); new Thread(c1).start(); new Thread(c2).start(); } }
SynchronousQueue類是BlockingQueue接口的一種實現。沒有容量,即便隊列裏面什麼都沒有,put()方法也會阻塞,直到另外一個線程調用了take();反之也成立。安全