日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

使用Java的BlockingQueue实现生产者-消费者

發(fā)布時間:2025/3/12 java 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Java的BlockingQueue实现生产者-消费者 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

BlockingQueue也是java.util.concurrent下的主要用來控制線程同步的工具。

BlockingQueue有四個具體的實現(xiàn)類,根據(jù)不同需求,選擇不同的實現(xiàn)類
1、ArrayBlockingQueue:一個由數(shù)組支持的有界阻塞隊列,規(guī)定大小的BlockingQueue,其構(gòu)造函數(shù)必須帶一個int參數(shù)來指明其大小.其所含的對象是以FIFO(先入先出)順序排序的。


2、LinkedBlockingQueue:大小不定的BlockingQueue,若其構(gòu)造函數(shù)帶一個規(guī)定大小的參數(shù),生成的BlockingQueue有大小限制,若不帶大小參數(shù),所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定.其所含的對象是以FIFO(先入先出)順序排序的。


3、PriorityBlockingQueue:類似于LinkedBlockQueue,但其所含對象的排序不是FIFO,而是依據(jù)對象的自然排序順序或者是構(gòu)造函數(shù)的Comparator決定的順序。


4、SynchronousQueue:特殊的BlockingQueue,對其的操作必須是放和取交替完成的。

?

LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的話,默認最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在隊列滿的時候會阻塞直到有隊列成員被消費,take方法在隊列空的時候會阻塞,直到有隊列成員被放進來。

?

生產(chǎn)者消費者的示例代碼:

生產(chǎn)者:

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,?生產(chǎn)線程:"??
  • ????????????????????+?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);??
  • ????????//?BlockingQueue<String>?queue?=?new?LinkedBlockingQueue<String>();??
  • ????????//不設(shè)置的話,LinkedBlockingQueue默認大小為Integer.MAX_VALUE??
  • ??????????
  • ????????//?BlockingQueue<String>?queue?=?new?ArrayBlockingQueue<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();??
  • ????????}??
  • ????}??
  • }??
  • ?打印結(jié)果:

    Text代碼??
  • I?have?made?a?product:Producer1??
  • I?have?made?a?product:Producer2??
  • A?Product,?生產(chǎn)線程:Producer1??
  • A?Product,?生產(chǎn)線程:Producer2??
  • I?have?made?a?product:Producer3??
  • A?Product,?生產(chǎn)線程:Producer3??
  • I?have?made?a?product:Producer5??
  • I?have?made?a?product:Producer4??
  • A?Product,?生產(chǎn)線程:Producer5??
  • A?Product,?生產(chǎn)線程:Producer4??
  • ?

    由于隊列的大小限定成了2,所以最多只有兩個產(chǎn)品被加入到隊列當中,而且消費者取到產(chǎn)品的順序也是按照生產(chǎn)的先后順序,原因就是LinkedBlockingQueue和ArrayBlockingQueue都是按照FIFO的順序存取元素的。


    來源:?<http://tonl.iteye.com/blog/1936391>


    總結(jié)

    以上是生活随笔為你收集整理的使用Java的BlockingQueue实现生产者-消费者的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。