生活随笔
收集整理的這篇文章主要介紹了
使用Java的BlockingQueue实现生产者-消费者
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
BlockingQueue也是java.util.concurrent下的主要用來控制線程同步的工具。
BlockingQueue有四個具體的實現類,根據不同需求,選擇不同的實現類
1、ArrayBlockingQueue:一個由數組支持的有界阻塞隊列,規定大小的BlockingQueue,其構造函數必須帶一個int參數來指明其大小.其所含的對象是以FIFO(先入先出)順序排序的。
2、LinkedBlockingQueue:大小不定的BlockingQueue,若其構造函數帶一個規定大小的參數,生成的BlockingQueue有大小限制,若不帶大小參數,所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定.其所含的對象是以FIFO(先入先出)順序排序的。
3、PriorityBlockingQueue:類似于LinkedBlockQueue,但其所含對象的排序不是FIFO,而是依據對象的自然排序順序或者是構造函數的Comparator決定的順序。
4、SynchronousQueue:特殊的BlockingQueue,對其的操作必須是放和取交替完成的。
?
LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的話,默認最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在隊列滿的時候會阻塞直到有隊列成員被消費,take方法在隊列空的時候會阻塞,直到有隊列成員被放進來。
?
生產者消費者的示例代碼:
生產者:
Java代碼??
import?java.util.concurrent.BlockingQueue;?? ?? public?class?Producer?implements?Runnable?{?? ????BlockingQueue<String>?queue;?? ?? ????public?Producer(BlockingQueue<String>?queue)?{?? ????????this.queue?=?queue;?? ????}?? ?? ????@Override?? ????public?void?run()?{?? ????????try?{?? ????????????String?temp?=?"A?Product,?生產線程:"?? ????????????????????+?Thread.currentThread().getName();?? ????????????System.out.println("I?have?made?a?product:"?? ????????????????????+?Thread.currentThread().getName());?? ????????????queue.put(temp);?? ????????}?catch?(InterruptedException?e)?{?? ????????????e.printStackTrace();?? ????????}?? ????}?? ?? }?? ?
?消費者:
Java代碼??
import?java.util.concurrent.BlockingQueue;?? ?? public?class?Consumer?implements?Runnable{?? ????BlockingQueue<String>?queue;?? ?????? ????public?Consumer(BlockingQueue<String>?queue){?? ????????this.queue?=?queue;?? ????}?? ?????? ????@Override?? ????public?void?run()?{?? ????????try?{?? ????????????String?temp?=?queue.take();?? ????????????System.out.println(temp);?? ????????}?catch?(InterruptedException?e)?{?? ????????????e.printStackTrace();?? ????????}?? ????}?? }?? ?測試類:
Java代碼??
import?java.util.concurrent.ArrayBlockingQueue;?? import?java.util.concurrent.BlockingQueue;?? import?java.util.concurrent.LinkedBlockingQueue;?? ?? public?class?Test3?{?? ?? ????public?static?void?main(String[]?args)?{?? ????????BlockingQueue<String>?queue?=?new?LinkedBlockingQueue<String>(2);?? ?????????? ?????????? ?????????? ?????????? ?? ????????Consumer?consumer?=?new?Consumer(queue);?? ????????Producer?producer?=?new?Producer(queue);?? ????????for?(int?i?=?0;?i?<?5;?i++)?{?? ????????????new?Thread(producer,?"Producer"?+?(i?+?1)).start();?? ?? ????????????new?Thread(consumer,?"Consumer"?+?(i?+?1)).start();?? ????????}?? ????}?? }?? ?打印結果:
Text代碼??
I?have?made?a?product:Producer1?? I?have?made?a?product:Producer2?? A?Product,?生產線程:Producer1?? A?Product,?生產線程:Producer2?? I?have?made?a?product:Producer3?? A?Product,?生產線程:Producer3?? I?have?made?a?product:Producer5?? I?have?made?a?product:Producer4?? A?Product,?生產線程:Producer5?? A?Product,?生產線程:Producer4?? ?
由于隊列的大小限定成了2,所以最多只有兩個產品被加入到隊列當中,而且消費者取到產品的順序也是按照生產的先后順序,原因就是LinkedBlockingQueue和ArrayBlockingQueue都是按照FIFO的順序存取元素的。
來源:?<http://tonl.iteye.com/blog/1936391>
總結
以上是生活随笔為你收集整理的使用Java的BlockingQueue实现生产者-消费者的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。