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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

阻塞队列-BlockningQueue

發布時間:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阻塞队列-BlockningQueue 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
阻塞隊列的前言介紹引用于https://www.cnblogs.com/aspirant/p/8657801.html,寫的挺好有興趣可以看一看

一. 前言

在新增的Concurrent包中,BlockingQueue很好的解決了多線程中,如何高效安全“傳輸”數據的問題。通過這些高效并且線程安全的隊列類,為我們快速搭建高質量的多線程程序帶來極大的便利。本文詳細介紹了BlockingQueue家庭中的所有成員,包括他們各自的功能以及常見使用場景。

二. 認識BlockingQueue

阻塞隊列,顧名思義,首先它是一個隊列,而一個隊列在數據結構中所起的作用大致如下圖所示:

  從上圖我們可以很清楚看到,通過一個共享的隊列,可以使得數據由隊列的一端輸入,從另外一端輸出;

常用的隊列主要有以下兩種:(當然通過不同的實現方式,還可以延伸出很多不同類型的隊列,DelayQueue就是其中的一種)

先進先出(FIFO):先插入的隊列的元素也最先出隊列,類似于排隊的功能。從某種程度上來說這種隊列也體現了一種公平性。

后進先出(LIFO):后插入隊列的元素最先出隊列,這種隊列優先處理最近發生的事件。

多線程環境中,通過隊列可以很容易實現數據共享,比如經典的“生產者”和“消費者”模型中,通過隊列可以很便利地實現兩者之間的數據共享。假設我們有若干生產者線程,另外又有若干個消費者線程。如果生產者線程需要把準備好的數據共享給消費者線程,利用隊列的方式來傳遞數據,就可以很方便地解決他們之間的數據共享問題。但如果生產者和消費者在某個時間段內,萬一發生數據處理速度不匹配的情況呢?理想情況下,如果生產者產出數據的速度大于消費者消費的速度,并且當生產出來的數據累積到一定程度的時候,那么生產者必須暫停等待一下(阻塞生產者線程),以便等待消費者線程把累積的數據處理完畢,反之亦然。然而,在concurrent包發布以前,在多線程環境下,我們每個程序員都必須去自己控制這些細節,尤其還要兼顧效率和線程安全,而這會給我們的程序帶來不小的復雜度。好在此時,強大的concurrent包橫空出世了,而他也給我們帶來了強大的BlockingQueue。(在多線程領域:所謂阻塞,在某些情況下會掛起線程(即阻塞),一旦條件滿足,被掛起的線程又會自動被喚醒),下面兩幅圖演示了BlockingQueue的兩個常見阻塞場景:

如上圖所示:當隊列中沒有數據的情況下,消費者端的所有線程都會被自動阻塞(掛起),直到有數據放入隊列。

如上圖所示:當隊列中填滿數據的情況下,生產者端的所有線程都會被自動阻塞(掛起),直到隊列中有空的位置,線程被自動喚醒。

這也是我們在多線程環境下,為什么需要BlockingQueue的原因。作為BlockingQueue的使用者,我們再也不需要關心什么時候需要阻塞線程,什么時候需要喚醒線程,因為這一切BlockingQueue都給你一手包辦了。

1.ArrayBlockingQueue


(1).拋出異常

public static void main(String[] args) {BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);System.out.println(blockingQueue.add("a"));System.out.println(blockingQueue.add("b"));System.out.println(blockingQueue.add("c"));System.out.println(blockingQueue.add("c"));System.out.println(blockingQueue.element());System.out.println(blockingQueue.remove());System.out.println(blockingQueue.remove());System.out.println(blockingQueue.remove());System.out.println(blockingQueue.remove());}

結果

(2)特殊值

public static void main(String[] args) {BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);System.out.println(blockingQueue.offer("a"));System.out.println(blockingQueue.offer("b"));System.out.println(blockingQueue.offer("b"));System.out.println(blockingQueue.offer("b"));System.out.println(blockingQueue.peek());System.out.println(blockingQueue.poll());System.out.println(blockingQueue.poll());System.out.println(blockingQueue.poll());System.out.println(blockingQueue.poll());}

(3)阻塞

public static void main(String[] args) throws InterruptedException {BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);blockingQueue.put("a");blockingQueue.put("b");blockingQueue.put("c");System.out.println("===========");System.out.println(blockingQueue.take());System.out.println(blockingQueue.take());System.out.println(blockingQueue.take());System.out.println(blockingQueue.take());}

(4)超時

System.out.println(blockingQueue.offer("a", 3L, TimeUnit.SECONDS));System.out.println(blockingQueue.offer("b", 3L, TimeUnit.SECONDS));System.out.println(blockingQueue.offer("c", 3L, TimeUnit.SECONDS));System.out.println(blockingQueue.offer("d", 3L, TimeUnit.SECONDS));System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));

2.SynchronizedQueue同步隊列

SynchronousQueue:不存儲元素的阻塞隊列,也即單個元素的隊列。
SynchronousQueue沒有容量。
與其他BlockingQueue不同,SynchronousQueue是一個不存儲元素的BlockingQueue。
每一個put操作必須要等待一個take操作,否則不能繼續添加元素,反之亦然。

package JUC;import java.util.concurrent.BlockingQueue; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.TimeUnit;public class SynchronizedQueueDemo {public static void main(String[] args) {BlockingQueue<String> blockingQueue = new SynchronousQueue<>();new Thread(()->{try {System.out.println(Thread.currentThread().getName()+"\t put1");blockingQueue.put("1");System.out.println(Thread.currentThread().getName()+"\t put2");blockingQueue.put("2");System.out.println(Thread.currentThread().getName()+"\t put3");blockingQueue.put("3");} catch (InterruptedException e) {e.printStackTrace();}},"A").start();new Thread(()->{try {TimeUnit.SECONDS.sleep(5);System.out.println(Thread.currentThread().getName()+"\ttake出:"+blockingQueue.take());TimeUnit.SECONDS.sleep(5);TimeUnit.SECONDS.sleep(5);System.out.println(Thread.currentThread().getName()+"\ttake出:"+blockingQueue.take());TimeUnit.SECONDS.sleep(5);System.out.println(Thread.currentThread().getName()+"\ttake出:"+blockingQueue.take());} catch (InterruptedException e) {e.printStackTrace();}},"B").start();} }

例子:阻塞隊列來寫生產者消費者

總結

以上是生活随笔為你收集整理的阻塞队列-BlockningQueue的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 免费在线视频你懂的 | 中国极品少妇xxxx做受 | 成人av毛片 | 在线观看日本 | 黄色aa大片 | 男生操女生屁股 | 美女视频黄是免费 | 欧美看片 | 国内精品第一页 | 黄色大片日本 | 艳情五月 | 少妇视频一区二区三区 | 黄大色黄大片女爽一次 | 精品资源成人 | 中文字幕三区 | 亚洲国产成人在线 | 理论黄色片 | aaa人片在线 | 中文字幕在线观看视频www | 久久性生活 | 91久久精品日日躁夜夜躁欧美 | av手机天堂 | 国产不卡精品视频 | 成人乱码一区二区三区 | 欧美精品一区二区三区在线 | 久久依人网 | 成人18视频免费69 | 青青草在线免费 | 久久久久久久久久久久久久av | 狠狠97| 欧美精品久久久 | 久久国产精品久久久久久 | 亚洲欧洲免费无码 | 樱花影院最新免费观看攻略 | 麻豆精品影院 | 美女视频黄a视频全免费观看 | 日本aaa视频| 九九午夜视频 | 久久精品国产亚洲av久一一区 | 国产精品久久久久久亚洲色 | 亚洲av毛片一区二二区三三区 | 中韩毛片 | 五月天婷婷视频 | 九色在线观看视频 | 日韩黄色av网站 | 污在线观看 | 亚洲欧美日韩一区二区三区四区 | 少妇一级淫片免费放播放 | 久久六六| 欧美丰满老妇 | 国产成人啪精品午夜在线观看 | 熟妇人妻系列aⅴ无码专区友真希 | 天堂资源在线 | 99热网址 | 西比尔在线观看完整视频高清 | 日韩女优网站 | 久久综合av| 福利网址在线观看 | 日韩毛片在线免费观看 | japan粗暴video蹂躏 | 99久久人妻无码精品系列 | 精品美女在线 | 欧美猛操 | 国产盗摄精品 | 免费日韩一级片 | 超碰超在线 | 国产精品888 | 亚洲美女色 | 久久久久久久蜜桃 | 久久韩国 | 天堂精品一区 | 超碰国产人人 | 福利色导航| 久久调教 | 成人动漫h在线观看 | 8050午夜一级毛片久久亚洲欧 | 久久精品五月天 | 黄色av免费播放 | 欧美日韩国产三区 | 国产片91| 污污网站在线播放 | 国产精品无码电影在线观看 | missav|免费高清av在线看 | 黄色片久久久 | 国产免费激情 | 中文字幕一区二区三区免费视频 | 日日夜夜爱爱 | 91播放在线 | www.超碰97.com | 黄色男人的天堂 | 欧美整片第一页 | 99视频热 | 国产视频不卡 | 一级黄色网址 | 欧美男女交配 | 国产精品久久久久久亚洲av | 狠狠干女人 | 免费视频毛片 | 色综合久久久久久 |