Java多线程_阻塞队列
生活随笔
收集整理的這篇文章主要介紹了
Java多线程_阻塞队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.什么是阻塞隊列
? ? ? ?我們知道,PriorityQueue、LinkedList這些都是非阻塞隊列。在我們使用非阻塞隊列的時候有一個很大問題,它不會對當前線程產生阻塞,那么在面對類似消費者-生產者的模型時,就必須額外地實現同步策略以及線程間喚醒策略,這個實現起來就非常麻煩。但是有了阻塞隊列就不一樣了,它會對當前線程產生阻塞,比如一個線程從一個空的阻塞隊列中取元素,此時線程會被阻塞直到阻塞隊列中有了元素。當隊列中有元素后,被阻塞的線程會自動被喚醒(不需要我們編寫代碼去喚醒)。這樣提供了極大的方便性。
2.阻塞隊列的種類
? ? ? ???阻塞隊列本質上就是隊列,它主要有一下幾種:
- ArrayBlockingQueue:基于數組實現的阻塞隊列,先進先出隊列,有界隊列。在創建時必須制定容量大小。并可以指定公平性與非公平性,默認情況下是非公平的,即不保證等待時間最長的隊列最優先能夠訪問隊列。
- LinkedBlockingQueue:基于鏈表實現的阻塞隊列,先進先出隊列,有界隊列。在創建時如果不指定容量大小,則默認大小為Integer.MAX_VALUE。
- PriorityBlockingQueue:按照元素的優先級對元素進行排序,按照優先級順序出隊。并且該阻塞隊列為無界阻塞隊列,即容量沒有上限(源碼中它沒有容器滿的信號標志)。
- DelayQueue:基于PriorityQueue的延時阻塞隊列,無界隊列。DelayQueue中的元素只有當其指定的延遲時間到了,才能夠從隊列中獲取到該元素。因為DelayQueue是一個無界隊列,所以往隊列中插入數據的操作永遠不會被阻塞,而只有獲取數據的操作才會被阻塞。
- SynchronousQueue:一個不存儲元素的阻塞隊列。
- LinkedTransferQueue:一個由鏈表結構組成的無界阻塞隊列。
- LinkedBlockingDeque:一個由鏈表結構組成的雙向阻塞隊列。
3.阻塞隊列中的幾個主要方法
- ? ? ? ?put方法用來向隊尾存入元素,如果隊列滿,則等待;
- take方法用來從隊首取元素,如果隊列為空,則等待;
- offer方法用來向隊尾存入元素,如果隊列滿,則等待一定的時間,當時間期限達到時,如果還沒有插入成功,則返回false;否則返回true;
- poll方法用來從隊首取元素,如果隊列空,則等待一定的時間,當時間期限達到時,如果取到,則返回null;否則返回取得的元素;
4.使用(以LinkedBlockingQueue為例)
?
import java.util.concurrent.LinkedBlockingQueue;public class BlockingQueueDemo {int size = 10;LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(size);public static void main(String[] args) {BlockingQueueDemo bqd = new BlockingQueueDemo();Consumer c = bqd.new Consumer();Productor p = bqd.new Productor();c.setName("消費者");p.setName("生產者");c.start();p.start();}class Consumer extends Thread {@Overridepublic void run() {consume();}private void consume() {while (true) {try {queue.take();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "消費了一個物品,還有" + queue.size() + "個物品");}}}class Productor extends Thread {@Overridepublic void run() {product();}private void product() {while (true) {try {queue.put(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "生產了一個物品,現有" + queue.size() + "個物品");}}} }?
轉載于:https://www.cnblogs.com/ericz2j/p/10283533.html
總結
以上是生活随笔為你收集整理的Java多线程_阻塞队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教你配置支付宝应用网关和授权回调地址
- 下一篇: 【UOJ#246】套路(动态规划)