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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java线程详解(15)-阻塞队列和阻塞栈

發(fā)布時間:2025/3/21 java 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java线程详解(15)-阻塞队列和阻塞栈 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Java線程:新特征-阻塞隊列

? ? ? ? 阻塞隊列是Java5線程新特征中的內(nèi)容,Java定義了阻塞隊列的接口java.util.concurrent.BlockingQueue,阻塞隊列的概念是,一個指定長度的隊列,如果隊列滿了,添加新元素的操作會被阻塞等待,直到有空位為止。同樣,當(dāng)隊列為空時候,請求隊列元素的操作同樣會阻塞等待,直到有可用元素為止。?

????????有了這樣的功能,就為多線程的排隊等候的模型實現(xiàn)開辟了便捷通道,非常有用。?

????????java.util.concurrent.BlockingQueue繼承了java.util.Queue接口,可以參看API文檔。?

????????下面給出一個簡單應(yīng)用的例子:

import?java.util.concurrent.ArrayBlockingQueue;?? import?java.util.concurrent.BlockingQueue;??/**?*?Java線程:線程池-阻塞隊列?*/?? public?class?Test?{??public?static?void?main(String[]?args)?throws?InterruptedException{??BlockingQueue?bqueue?=?new?ArrayBlockingQueue(20);??for?(int?i?=?0;?i?<?30;?i++)?{??//將指定元素添加到此隊列中,如果沒有可用空間,將一直等待(如果有必要)。??bqueue.put(i);??System.out.println("向阻塞隊列中添加了元素:"?+?i);??}??System.out.println("程序到此運(yùn)行結(jié)束,即將退出----");??}?? }??


????????執(zhí)行結(jié)果:

向阻塞隊列中添加了元素:0?? 向阻塞隊列中添加了元素:1?? 向阻塞隊列中添加了元素:2?? 向阻塞隊列中添加了元素:3?? 向阻塞隊列中添加了元素:4?? 向阻塞隊列中添加了元素:5?? 向阻塞隊列中添加了元素:6?? 向阻塞隊列中添加了元素:7?? 向阻塞隊列中添加了元素:8?? 向阻塞隊列中添加了元素:9?? 向阻塞隊列中添加了元素:10?? 向阻塞隊列中添加了元素:11?? 向阻塞隊列中添加了元素:12?? 向阻塞隊列中添加了元素:13?? 向阻塞隊列中添加了元素:14?? 向阻塞隊列中添加了元素:15?? 向阻塞隊列中添加了元素:16?? 向阻塞隊列中添加了元素:17?? 向阻塞隊列中添加了元素:18?? 向阻塞隊列中添加了元素:19??


????????可以看出,輸出到元素19時候,就一直處于等待狀態(tài),因為隊列滿了,程序阻塞了。

????????這里沒有用多線程來演示,沒有這個必要。

????????另外,阻塞隊列還有更多實現(xiàn)類,用來滿足各種復(fù)雜的需求:ArrayBlockingQueue, DelayQueue,LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue,具體的API差別也很小。

?

Java線程:新特征-阻塞棧

? ? ? ? 對于阻塞棧,與阻塞隊列相似。不同點在于棧是“后入先出”的結(jié)構(gòu),每次操作的是棧頂,而隊列是“先進(jìn)先出”的結(jié)構(gòu),每次操作的是隊列頭。

????????這里要特別說明一點的是,阻塞棧是Java6的新特征。

????????Java為阻塞棧定義了接口:java.util.concurrent.BlockingDeque,其實現(xiàn)類也比較多,具體可以查看JavaAPI文檔。

????????下面看一個簡單例子:

import?java.util.concurrent.BlockingDeque;?? import?java.util.concurrent.LinkedBlockingDeque;??/**?*?Java線程:線程池-阻塞棧?*/?? public?class?Test?{??public?static?void?main(String[]?args)?throws?InterruptedException{??BlockingDeque?bDeque?=?new?LinkedBlockingDeque(20);??for?(int?i?=?0;?i?<?30;?i++)?{??//將指定元素添加到此阻塞棧中,如果沒有可用空間,將一直等待(如果有必要)。??bDeque.putFirst(i);??System.out.println("向阻塞棧中添加了元素:"?+?i);??}??System.out.println("程序到此運(yùn)行結(jié)束,即將退出----");??}?? }??


????????執(zhí)行結(jié)果:

向阻塞棧中添加了元素:0?? 向阻塞棧中添加了元素:1?? 向阻塞棧中添加了元素:2?? 向阻塞棧中添加了元素:3?? 向阻塞棧中添加了元素:4?? 向阻塞棧中添加了元素:5?? 向阻塞棧中添加了元素:6?? 向阻塞棧中添加了元素:7?? 向阻塞棧中添加了元素:8?? 向阻塞棧中添加了元素:9?? 向阻塞棧中添加了元素:10?? 向阻塞棧中添加了元素:11?? 向阻塞棧中添加了元素:12?? 向阻塞棧中添加了元素:13?? 向阻塞棧中添加了元素:14?? 向阻塞棧中添加了元素:15?? 向阻塞棧中添加了元素:16?? 向阻塞棧中添加了元素:17?? 向阻塞棧中添加了元素:18?? 向阻塞棧中添加了元素:19??


????????從上面結(jié)果可以看到,程序并沒結(jié)束,而是阻塞住了,原因是棧已經(jīng)滿了,后面追加元素的操作都被阻塞了。
?

總結(jié)

以上是生活随笔為你收集整理的Java线程详解(15)-阻塞队列和阻塞栈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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