首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 6 線程新特性:BlockingDeque 阻塞雙端隊列詳解

     編輯:Java 相關知識

阻塞雙端隊列特性

BlockingDeque 繼承 Deque 和 BlockingQueue,支持兩端操作:

  • 棧模式 (LIFO):push()/pop() 等同 addFirst()/removeFirst()
  • 隊列模式 (FIFO):addLast()/removeFirst()
  • 阻塞方法:putFirst()、putLast()、takeFirst()、takeLast()

Java 6 引入,實現類:LinkedBlockingDeque(鏈表,可選有界)。

代碼示例:棧模式阻塞操作

import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;

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("程序到此運行結束,即將退出----");
    }
}

運行結果

向阻塞棧中添加了元素:0
...
向阻塞棧中添加了元素:19
// 程序阻塞於 putFirst(20),棧已滿

與隊列類似,容量20滿後阻塞。異在於插入/移除位置:棧操作棧頂 (First),隊列操作隊尾/隊頭。

棧 vs 隊列 核心差異

維度BlockingDeque (棧)BlockingQueue (隊列)
數據結構LIFO (後進先出)FIFO (先進先出)
核心操作push/pop / putFirst/takeFirstput/take / add/remove
典型場景深度優先搜索、遞歸替代、回溯生產消費、任務調度、緩存
雙端優勢兩端均可入出,靈活性高單向流動,語義清晰

進階用法

  • 工作竊取隊列:ForkJoinPool 內部使用,雙端支持任務竊取
  • 雙向緩存:頭部插入高優先級任務,尾部插入普通任務
  • 非阻塞嘗試:offerFirst()、pollLast() 等不阻塞版本

出處:https://lavasoft.blog.51cto.com/62575/222530

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved