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

Java 並發核心:BlockingQueue 五大實現類深度解析與生產消費者實戰

     編輯:Java 綜合教學

BlockingQueue 阻塞隊列全面解析

java.util.concurrent.BlockingQueue 是 Java 並發包中實現「生產者-消費者」模式的核心工具。本文深度解析五大經典實現類的特性、適用場景與代碼實戰。

五大實現類對比表

隊列類型底層結構容量順序策略核心特性典型場景
ArrayBlockingQueue數組有界FIFO公平鎖可選,效能穩定固定緩衝區、任務調度
LinkedBlockingQueue鏈表可選有界FIFO吞吐量高,預設無界易 OOM高併發任務隊列、日誌緩衝
DelayQueue堆 (PriorityQueue)無界延遲時間排序元素需實現 Delayed,到期才可取定時任務、緩存過期清理
PriorityBlockingQueue堆無界優先級排序元素需 Comparable,不阻塞插入優先級任務調度、醫療分診系統
SynchronousQueue無緩衝0直接移交插入必須等待取走,極高吞吐線程池遷移任務、直接遞交場景

核心 API 對比

操作拋出異常返回布爾值阻塞等待超時等待
插入add(e)offer(e)put(e)offer(e, time, unit)
移除remove()poll()take()poll(time, unit)
檢查element()peek()不可用不可用

生產消費者完整實戰代碼

public class BlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        // 1. 有界隊列,生產快消費慢演示
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(5);
        ExecutorService executor = Executors.newCachedThreadPool();
        
        // 生產者:每 1 秒生產一個
        executor.execute(() -> {
            try {
                for (int i = 0; i < 10; i++) {
                    String item = "item-" + i;
                    queue.put(item); // 隊列滿時阻塞
                    System.out.println("生產: " + item + " | 隊列大小: " + queue.size());
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
        });
        
        // 消費者:每 3 秒消費一個
        executor.execute(() -> {
            try {
                while (true) {
                    String item = queue.take(); // 隊列空時阻塞
                    System.out.println("消費: " + item + " | 隊列大小: " + queue.size());
                    Thread.sleep(3000);
                }
            } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
        });
        
        executor.shutdown();
    }
}

進階應用場景

DelayQueue 實現定時任務

class DelayTask implements Delayed {
    private final long executeTime;
    private final String taskName;
    
    public DelayTask(String name, long delayMs) {
        this.taskName = name;
        this.executeTime = System.currentTimeMillis() + delayMs;
    }
    
    @Override public long getDelay(TimeUnit unit) {
        return unit.convert(executeTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }
    @Override public int compareTo(Delayed o) {
        return Long.compare(this.executeTime, ((DelayTask)o).executeTime);
    }
}

// 使用
DelayQueue<DelayTask> delayQueue = new DelayQueue<>();
delayQueue.put(new DelayTask("發送郵件", 5000)); // 5 秒後執行
delayQueue.put(new DelayTask("清理緩存", 10000)); // 10 秒後執行

SynchronousQueue 在線程池中的應用

Executors.newCachedThreadPool() 內部使用 SynchronousQueue,新任務直接移交給空閒線程,無空閒線程則創建新線程,實現「零緩衝」高吞吐。

選型建議

  • 固定緩衝、追求公平:ArrayBlockingQueue
  • 高吞吐、無明確容量上限:LinkedBlockingQueue (強烈建議指定容量)
  • 定時/延遲執行:DelayQueue
  • 優先級處理:PriorityBlockingQueue
  • 直接遞交、線程間交接:SynchronousQueue
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved