java中的BlockingQueue(阻塞隊(duì)列)解析
BlockingQueue
阻塞隊(duì)列(BlockingQueue) 是一個(gè)支持兩個(gè)附加操作的隊(duì)列。這兩個(gè)附加的操作是:在隊(duì)列為空時(shí),獲取元素的線程會(huì)等待隊(duì)列變?yōu)榉强铡?/p>
當(dāng)隊(duì)列滿時(shí),存儲(chǔ)元素的線程會(huì)等待隊(duì)列可用。阻塞隊(duì)列常用于生產(chǎn)者和消費(fèi)者的場(chǎng)景,生產(chǎn)者是往隊(duì)列里添加元素的線程,消費(fèi)者是從隊(duì)列里拿元素的線程。
阻塞隊(duì)列就是生產(chǎn)者存放元素的容器,而消費(fèi)者也只從容器里拿元素。
使用場(chǎng)景: 多線程并發(fā)處理,線程池!
隊(duì)列 FIFO先進(jìn)先出 一端寫入一端取出
寫入如果隊(duì)列滿了就必須阻塞等待 如果隊(duì)列是空的必須阻塞等待生產(chǎn)
注意:BlockingQueue 不接受null值 試圖添加一個(gè)null元素時(shí)會(huì)拋出異常
BlockingQueue 可以是限定容量的 超過給定容量時(shí)是無法添加的
JDK中七個(gè)隊(duì)列
- ArrayBolckingQueue(常用):基于數(shù)組的有界阻塞隊(duì)列
- LinkedBlockingQueue(常用):基于鏈表的有界阻塞隊(duì)列 大小默認(rèn)為 Integer最大值
- PriorityBlockingQueue : 一個(gè)支持優(yōu)先級(jí)排序的無界阻塞隊(duì)列。
- DelayQueue: 使用優(yōu)先級(jí)隊(duì)列實(shí)現(xiàn)的延遲無界阻塞隊(duì)列
- SynchronousQueue: 一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列。
- LinkedTransferQueue: 一個(gè)由鏈表結(jié)構(gòu)組成的無界阻塞隊(duì)列。
- LinkedBlockingDeque: 一個(gè)由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列
阻塞隊(duì)列核心方法
方法類型 | 拋出異常 | 特殊值( 有返回值) | 阻塞 | 超時(shí) |
插入 | add | offer | put | offer |
移除 | remove | poll | take | poll |
判斷隊(duì)列首 | element | peek | - | - |
ArrayBolckingQueue使用示例
演示各個(gè)API的使用
public class Test { public static void main(String[] args) { test1(); }
第一組會(huì)拋出異常API演示 add remove element
/** * 拋出異常 */ public static void test1(){ //指定隊(duì)列大小 ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3); //add添加成功返回true System.out.println(arrayBlockingQueue.add("1")); System.out.println(arrayBlockingQueue.add("2")); System.out.println(arrayBlockingQueue.add("3")); //查看隊(duì)首的元素是誰 1 System.out.println(arrayBlockingQueue.element()); //超過隊(duì)列大小 add會(huì)拋出異常 Queue full // System.out.println(arrayBlockingQueue.add("4")); //remove取出一個(gè)元素 返回取出的值 如果隊(duì)列為空 remove會(huì)拋出異常 // NoSuchElementException System.out.println(arrayBlockingQueue.remove()); System.out.println(arrayBlockingQueue.remove()); System.out.println(arrayBlockingQueue.remove()); System.out.println(arrayBlockingQueue.remove()); }
第二組API使用
public static void test1(){ //隊(duì)列的大小 ArrayBlockingQueue<Object> blockingQueue = new ArrayBlockingQueue<>(2); //offer 添加一個(gè)元素 返回一個(gè)boolean值 成功返回true失敗返回true System.out.println(blockingQueue.offer(1)); System.out.println(blockingQueue.offer(2)); System.out.println(blockingQueue.offer(3)); System.out.println("----------------"); //檢測(cè)隊(duì)首元素 System.out.println(blockingQueue.peek()); //poll 取出一個(gè)元素 返回一個(gè)元素 隊(duì)列為空時(shí) 取出null System.out.println(blockingQueue.poll()); System.out.println(blockingQueue.peek()); System.out.println(blockingQueue.poll()); System.out.println(blockingQueue.poll()); }
第三組阻塞API使用
放不進(jìn)去了會(huì)一直阻塞直到有空位
/** * 等待 一直阻塞 */ public static void test1(){ ArrayBlockingQueue<Object> blockingQueue = new ArrayBlockingQueue<>(2); try { //put添加元素 沒有返回值 滿了一直阻塞 //隊(duì)列大小為二 第三個(gè)元素放不進(jìn)去 阻塞兩秒過后就會(huì)結(jié)束 blockingQueue.put("1"); blockingQueue.put("2"); blockingQueue.put("3"); } catch (InterruptedException e) { e.printStackTrace(); } try { //取出元素 空了一直阻塞 返回值取出的元素 System.out.println(blockingQueue.take());; System.out.println(blockingQueue.take()); System.out.println(blockingQueue.take()); } catch (InterruptedException e) { e.printStackTrace(); } }
第四組API使用
設(shè)置阻塞時(shí)間 超過阻塞時(shí)間沒放進(jìn)去就放棄等待
/** * 等待 超時(shí)阻塞 */ public static void test4(){ ArrayBlockingQueue<Object> blockingQueue = new ArrayBlockingQueue<>(2); try { //參數(shù) 插入的數(shù)值 超時(shí)時(shí)間 和 單位 blockingQueue.offer("1"); blockingQueue.offer("2"); blockingQueue.offer("3",2, TimeUnit.SECONDS); System.out.println("------"); System.out.println(blockingQueue.poll()); System.out.println(blockingQueue.poll()); System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS)); } catch (InterruptedException e) { e.printStackTrace(); } }
到此這篇關(guān)于java中的BlockingQueue(阻塞隊(duì)列)解析的文章就介紹到這了,更多相關(guān)BlockingQueue阻塞隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JavaEE多線程中阻塞隊(duì)列的項(xiàng)目實(shí)踐
- Java的PriorityBlockingQueue優(yōu)先級(jí)阻塞隊(duì)列代碼實(shí)例
- Java中的SynchronousQueue阻塞隊(duì)列使用代碼實(shí)例
- Java中的SynchronousQueue阻塞隊(duì)列及使用場(chǎng)景解析
- Java中的BlockingQueue阻塞隊(duì)列原理以及實(shí)現(xiàn)詳解
- Java的非阻塞隊(duì)列ConcurrentLinkedQueue解讀
- java中阻塞隊(duì)列和非阻塞隊(duì)列的實(shí)現(xiàn)
- Java多線程實(shí)現(xiàn)阻塞隊(duì)列的示例代碼
相關(guān)文章
jpa?onetomany?使用級(jí)連表刪除被維護(hù)表數(shù)據(jù)時(shí)的坑
這篇文章主要介紹了jpa?onetomany?使用級(jí)連表刪除被維護(hù)表數(shù)據(jù)時(shí)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12在Java生產(chǎn)環(huán)境下進(jìn)行性能監(jiān)控與調(diào)優(yōu)的詳細(xì)過程
在Java生產(chǎn)環(huán)境下進(jìn)行性能監(jiān)控與調(diào)優(yōu)是一個(gè)復(fù)雜但重要的過程,它涉及到多個(gè)方面,包括代碼分析、JVM監(jiān)控、線程管理、垃圾收集優(yōu)化、內(nèi)存管理、數(shù)據(jù)庫交互等,下面我將提供一個(gè)詳細(xì)的概述和示例代碼,需要的朋友可以參考下2025-02-02java編譯后的文件出現(xiàn)xx$1.class的原因及解決方式
這篇文章主要介紹了java編譯后的文件出現(xiàn)xx$1.class的原因及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12關(guān)于Arrays.sort()使用的注意事項(xiàng)
這篇文章主要介紹了關(guān)于Arrays.sort()使用的注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05Log4j按級(jí)別輸出日志到不同文件的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄狶og4j按級(jí)別輸出日志到不同文件的實(shí)現(xiàn)方法。2016-11-11