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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

集合框架 Queue---BlockingQueue详解

發布時間:2023/12/3 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 集合框架 Queue---BlockingQueue详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自??集合框架 Queue---BlockingQueue詳解

?

  • 摘要:本例介紹一個特殊的隊列:BlockingQueue,如果BlockingQueue是空的,從BlockingQueue取東西的操作將會被阻斷進入等待狀態,直到BlockingQueue進了東西才會被喚醒,同樣,如果BlockingQueue是滿的,任何試圖往里存東西的操作也會被阻斷進入等待狀態,直到BlockingQueue里有空間時才會被喚醒繼續操作。??????本例再次實現前面介紹的籃子程序,不過這個籃子中最多能
  • 本例介紹一個特殊的隊列:BlockingQueue,如果BlockingQueue是空的,從BlockingQueue取東西的操作將會被阻斷進入等待狀態,直到BlockingQueue進了東西才會被喚醒,同樣,如果BlockingQueue是滿的,任何試圖往里存東西的操作也會被阻斷進入等待狀態,直到BlockingQueue里有空間時才會被喚醒繼續操作。
    ?????? 本例再次實現前面介紹的籃子程序,不過這個籃子中最多能放得蘋果數不是1,可以隨意指定。當籃子滿時,生產者進入等待狀態,當籃子空時,消費者等待。
    ?????? BlockingQueue定義的常用方法如下:
    ??????????????? add(anObject):把anObject加到BlockingQueue里,如果BlockingQueue可以容納,則返回true,否則拋出異常。
    ??????????????? offer(anObject):表示如果可能的話,將anObject加到BlockingQueue里,即如果BlockingQueue可以容納,則返回true,否則返回false。
    ??????????????? put(anObject):把anObject加到BlockingQueue里,如果BlockingQueue沒有空間,則調用此方法的線程被阻斷直到BlockingQueue里有空間再繼續。
    ??????????????? poll(time):取走BlockingQueue里排在首位的對象,若不能立即取出,則可以等time參數規定的時間,取不到時返回null。
    ??????????????? take():取走BlockingQueue里排在首位的對象,若BlockingQueue為空,阻斷進入等待狀態直到BlockingQueue有新的對象被加入為止。
    ?????? BlockingQueue有四個具體的實現類,根據不同需求,選擇不同的實現類:
    ??????????????? ArrayBlockingQueue:規定大小的BlockingQueue,其構造函數必須帶一個int參數來指明其大小。其所含的對象是以FIFO(先入先出)順序排序的。
    ??????????????? LinkedBlockingQueue:大小不定的BlockingQueue,若其構造函數帶一個規定大小的參數,生成的BlockingQueue有大小限制,若不帶大小參數,所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定。其所含的對象是以FIFO順序排序的。
    ??????????????? PriorityBlockingQueue:類似于LinkedBlockingQueue,但其所含對象的排序不是FIFO,而是依據對象的自然排序順序或者是構造函數所帶的Comparator決定的順序。
    ??????????????? SynchronousQueue:特殊的BlockingQueue,對其的操作必須是放和取交替完成的。
    ?????? LinkedBlockingQueue和ArrayBlockingQueue比較起來,它們背后所用的數據結構不一樣,導致LinkedBlockingQueue的數據吞吐量要大于ArrayBlockingQueue,但在線程數量很大時其性能的可預見性低于ArrayBlockingQueue。

import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** *//** * BlockingQueue是一種特殊的Queue,若BlockingQueue是空的, * 從BlockingQueue取東西的操作將會被阻斷進入等待狀態直到BlocingkQueue進了新貨才會被喚醒。 * 同樣,如果BlockingQueue是滿的任何試圖往里存東西的操作也會被阻斷進入等待狀態, * 直到BlockingQueue里有新的空間才會被喚醒繼續操作。 * BlockingQueue提供的方法主要有: * add(anObject): 把anObject加到BlockingQueue里,如果BlockingQueue可以容納返回true,否則拋出IllegalStateException異常。 * offer(anObject):把anObject加到BlockingQueue里,如果BlockingQueue可以容納返回true,否則返回false。 * put(anObject):把anObject加到BlockingQueue里,如果BlockingQueue沒有空間,調用此方法的線程被阻斷直到BlockingQueue里有新的空間再繼續。 * poll(time):取出BlockingQueue里排在首位的對象,若不能立即取出可等time參數規定的時間。取不到時返回null。 * take():取出BlockingQueue里排在首位的對象,若BlockingQueue為空,阻斷進入等待狀態直到BlockingQueue有新的對象被加入為止。 * * 根據不同的需要BlockingQueue有4種具體實現: * (1)ArrayBlockingQueue:規定大小的BlockingQueue,其構造函數必須帶一個int參數來指明其大小。其所含的對象是以FIFO(先入先出)順序排序的。 * (2)LinkedBlockingQueue:大小不定的BlockingQueue,若其構造函數帶一個規定大小的參數,生成的BlockingQueue有大小限制, * 若不帶大小參數,所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定。其所含的對象是以FIFO(先入先出)順序排序的。 * LinkedBlockingQueue和ArrayBlockingQueue比較起來,它們背后所用的數據結構不一樣, * 導致LinkedBlockingQueue的數據吞吐量要大于ArrayBlockingQueue,但在線程數量很大時其性能的可預見性低于ArrayBlockingQueue。 * (3)PriorityBlockingQueue:類似于LinkedBlockingQueue,但其所含對象的排序不是FIFO,而是依據對象的自然排序順序或者是構造函數所帶的Comparator決定的順序。 * (4)SynchronousQueue:特殊的BlockingQueue,對其的操作必須是放和取交替完成的。 * * 下面是用BlockingQueue來實現Producer和Consumer的例子 */ public class BlockingQueueTest { /** *//** * 定義裝蘋果的籃子 */ public static class Basket{ // 籃子,能夠容納3個蘋果 BlockingQueue basket = new ArrayBlockingQueue (3); // 生產蘋果,放入籃子 public void produce() throws InterruptedException{ // put方法放入一個蘋果,若basket滿了,等到basket有位置 basket.put("An apple"); } // 消費蘋果,從籃子中取走 public String consume() throws InterruptedException{ // get方法取出一個蘋果,若basket為空,等到basket有蘋果為止 return basket.take(); } } // 測試方法 public static void testBasket() { // 建立一個裝蘋果的籃子 final Basket basket = new Basket(); // 定義蘋果生產者 class Producer implements Runnable { public void run() { try { while (true) { // 生產蘋果 System.out.println("生產者準備生產蘋果:" + System.currentTimeMillis()); basket.produce(); System.out.println("生產者生產蘋果完畢:" + System.currentTimeMillis()); // 休眠300ms Thread.sleep(300); } } catch (InterruptedException ex) { } } } // 定義蘋果消費者 class Consumer implements Runnable { public void run() { try { while (true) { // 消費蘋果 System.out.println("消費者準備消費蘋果:" + System.currentTimeMillis()); basket.consume(); System.out.println("消費者消費蘋果完畢:" + System.currentTimeMillis()); // 休眠1000ms Thread.sleep(1000); } } catch (InterruptedException ex) { } } } ExecutorService service = Executors.newCachedThreadPool(); Producer producer = new Producer(); Consumer consumer = new Consumer(); service.submit(producer); service.submit(consumer); // 程序運行5s后,所有任務停止 try { Thread.sleep(5000); } catch (InterruptedException e) { } service.shutdownNow(); } public static void main(String[] args) { BlockingQueueTest.testBasket(); } }

?

總結

以上是生活随笔為你收集整理的集合框架 Queue---BlockingQueue详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。