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

Java 5 線程新特性:BlockingQueue 阻塞隊列實戰

     編輯:Java 相關知識

阻塞隊列核心特性

BlockingQueue 繼承 Queue,提供阻塞語義:

  • put(e):隊列滿時阻塞,直到有空位
  • take():隊列空時阻塞,直到有元素
  • offer(e, timeout) / poll(timeout):帶超時版本

天然適合「生產者-消費者」模式,無需手動 wait/notify。

常見實現類

實現類特點適用場景
ArrayBlockingQueue有界數組,FIFO固定大小緩存、任務隊列
LinkedBlockingQueue可選有界鏈表,FIFO高吞吐生產消費、無界緩存
PriorityBlockingQueue優先級排序,無界優先級任務調度
DelayQueue延遲執行,無界定時任務、緩存過期清理
SynchronousQueue無容量,直接移交線程間直接傳遞、CachedThreadPool

代碼示例:ArrayBlockingQueue 基本操作

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;

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

運行結果

向阻塞隊列中添加了元素:0
...
向阻塞隊列中添加了元素:19
// 程序阻塞於 put(20),因隊列已滿無消費者

第20個元素 (索引19) 入隊後,隊列滿 (容量20),第21次 put() 永久阻塞。

生產者-消費者完整模式

BlockingQueue queue = new LinkedBlockingQueue<>(100);

// 生產者
new Thread(() -> {
    while (running) {
        Task task = produce();
        queue.put(task); // 自動阻塞等待空位
    }
}).start();

// 消費者
new Thread(() -> {
    while (running) {
        Task task = queue.take(); // 自動阻塞等待任務
        consume(task);
    }
}).start();

優勢總結

  • 線程安全、無鎖編程(內部用 ReentrantLock + Condition)
  • 自動處理阻塞/喚醒,代碼簡潔不易出錯
  • 豐富超時、批量操作 API (drainTo 等)
  • JDK 內置,無第三方依賴

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

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