Java线程详解(15)-阻塞队列和阻塞栈
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é)果:
????????可以看出,輸出到元素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é)果:
????????從上面結(jié)果可以看到,程序并沒結(jié)束,而是阻塞住了,原因是棧已經(jīng)滿了,后面追加元素的操作都被阻塞了。
?
總結(jié)
以上是生活随笔為你收集整理的Java线程详解(15)-阻塞队列和阻塞栈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java线程详解(14)-信号量
- 下一篇: java美元兑换,(Java实现) 美元