阻塞隊(duì)列

1.BlockingQueue接口

繼承了Queue接口,為隊(duì)列的一種類(lèi)型,區(qū)別于隊(duì)列的2種操作為:
(1)put:隊(duì)列滿時(shí),隊(duì)列阻塞插入元素線程
(2)take:隊(duì)列阻塞時(shí),獲取元素線程阻塞
思考:阻塞隊(duì)列是否有容量限制?
看種類(lèi),有界隊(duì)列以ArrayBlockingQueue為主;無(wú)界以LinkedBlockingQueue為主;

2. ArrayBlockingQueue

最典型的有界隊(duì)列
由數(shù)組存儲(chǔ)元素,初始化時(shí)需指定大??;
利用ReentrantLock實(shí)現(xiàn)線程安全;
最佳實(shí)踐:生產(chǎn)者與消費(fèi)者速度基本匹配時(shí)使用;
(1)入隊(duì)邏輯:

void put(E e) {
  final ReentrantLock lock = this.lock;
  lock.lockInterruptibly();
  try {
    while (count == items.length) {
      notfull.await();   // 隊(duì)列滿,阻塞
    } 
    enqueue(e);
  } finally {
    lock.unlock();
  }
}

(2)出隊(duì)邏輯:

void enqueue(E x) {
  final Object[] items = this.items;
  items[putIndex] = x;
  if (++putIndex == items.length) {
      putIndex = 0; // 隊(duì)列滿時(shí),指針歸0,相較于刪除O(n),時(shí)間消耗為O(1)
  }
  count++;
  notEmpty.signal(); // 喚醒消費(fèi)線程,開(kāi)始消費(fèi)
}

3. LinkedBlockingQueue

基于鏈表實(shí)現(xiàn)的阻塞隊(duì)列,為無(wú)界隊(duì)列

3.1 重要特性:讀寫(xiě)鎖分離

final ReentrantLock takeLock, putLock分別控制進(jìn)出
Conditional notEmpty, notFull作為進(jìn)出條件隊(duì)列

3.2 使用場(chǎng)景

(1)線程池重要組成:讀寫(xiě)鎖分離,高效率

4. LinkedBlockingDeque

類(lèi)似LinkedBlockingQueue;區(qū)別在于該隊(duì)列為雙向隊(duì)列;并可控制出入隊(duì)規(guī)則

5. synchronousQueue同步隊(duì)列

一個(gè)沒(méi)有數(shù)據(jù)緩沖的BlockingQueue,容量為0,不會(huì)為隊(duì)列中的元素維護(hù)儲(chǔ)存空間,僅負(fù)責(zé)多線程的交換
(1)特性:提供公平/非公平兩種鎖(棧/隊(duì)列)
(2)使用流程,以隊(duì)列為例:
入隊(duì):構(gòu)造Node節(jié)點(diǎn)入隊(duì),并阻塞當(dāng)前線程
出隊(duì):將隊(duì)首/尾節(jié)點(diǎn)喚醒,進(jìn)行出隊(duì)
(3)應(yīng)用場(chǎng)景:對(duì)賬及批跑
對(duì)應(yīng)一個(gè)生產(chǎn)者, 僅有一個(gè)消費(fèi)者:一對(duì)一處理關(guān)系
如在線程池中,不確定生產(chǎn)者請(qǐng)求數(shù)量,且需要實(shí)時(shí)處理任務(wù),可選擇該隊(duì)列為每個(gè)生產(chǎn)者分配一個(gè)消費(fèi)者
例如:在Executor.newCachedThreadPool采用了該種思路

6. PriorityBlockingQueue 優(yōu)先級(jí)隊(duì)列

一種無(wú)界的基于數(shù)組優(yōu)先級(jí)的阻塞隊(duì)列
(1)使用場(chǎng)景:電商搶購(gòu),會(huì)員級(jí)別高的先出隊(duì)列
(2)數(shù)據(jù)結(jié)構(gòu):二叉堆(大頂堆,小頂堆)
(3)相關(guān)代碼:

7. 延遲隊(duì)列

(1)實(shí)現(xiàn):由優(yōu)先級(jí)隊(duì)列
(2)使用場(chǎng)景:超時(shí)關(guān)單,任務(wù)的超時(shí)處理,mq掛掉后的重啟

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容