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

Java 並發套件 java.util.concurrent 核心組件實戰指南

     編輯:Java 相關知識

JUC 套件架構概覽

java.util.concurrent (JUC) 由 Doug Lea 設計,提供高效能、執行緒安全的並發工具,取代低層級 wait/notify/synchronized,解決死鎖、活鎖、飢餓等經典問題。

核心介面與類別分類

類別用途關鍵特性
Executor任務執行者介面解耦任務提交與執行細節
ExecutorService執行緒池管理生命週期控制、Future 回傳、關閉機制
ScheduledExecutorService排程任務固定延遲/週期執行
Future非同步結果get() 阻塞取得、cancel() 取消
CompletableFuture組合式非同步thenApply/thenCompose/whenComplete 鏈式操作
Lock/ReentrantLock顯式鎖公平/非公平、可中斷、條件變數
Semaphore計數信號量資源池存取控制
CountDownLatch倒數閂鎖一次性等待多任務完成
CyclicBarrier循環柵欄可重複使用的集合點同步
BlockingQueue阻塞隊列生產者-消費者模式基石
ConcurrentHashMap並發雜湊表分段鎖/JDK8 CAS+Synchronized 高併發
CopyOnWriteArrayList寫入複製陣列讀多寫少場景最佳化

執行緒池建立最佳實踐


// 1. 固定大小執行緒池(適用於負載穩定)
ExecutorService fixed = Executors.newFixedThreadPool(4);

// 2. 快取執行緒池(適用於大量短任務)
ExecutorService cached = Executors.newCachedThreadPool();

// 3. 單一執行緒序列化執行
ExecutorService single = Executors.newSingleThreadExecutor();

// 4. 生產環境推薦:自訂 ThreadPoolExecutor 精確控制
ThreadPoolExecutor custom = new ThreadPoolExecutor(
    4,              // corePoolSize
    8,              // maximumPoolSize
    60L, TimeUnit.SECONDS, // keepAliveTime
    new LinkedBlockingQueue<>(100), // 有界隊列防止 OOM
    new ThreadFactoryBuilder().setNameFormat("biz-worker-%d").build(),
    new ThreadPoolExecutor.AbortPolicy() // 拒絕策略
);

同步工具實戰範例

Semaphore:資源池存取控制


// 模擬 2 個車位的停車場
Semaphore parking = new Semaphore(2);

void parkCar(int carId) {
    parking.acquire(); // 獲取車位,無位則阻塞
    try {
        System.out.println("車輛 " + carId + " 進場");
        Thread.sleep((long) (Math.random() * 5000));
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    } finally {
        System.out.println("車輛 " + carId + " 離場");
        parking.release(); // 釋放車位
    }
}

CountDownLatch vs CyclicBarrier

  • CountDownLatch:一次性計數器,主執行緒等待 N 個子任務完成(如應用啟動初始化)
  • CyclicBarrier:可重置的集合點,N 個執行緒互相等待至同一屏障(如多階段並行計算)

CompletableFuture 非同步組合


CompletableFuture.supplyAsync(() -> fetchUser(1))
    .thenApply(user -> enrichProfile(user))
    .thenCompose(profile -> CompletableFuture.supplyAsync(() -> fetchRecommendations(profile)))
    .whenComplete((result, ex) -> {
        if (ex != null) log.error("推薦失敗", ex);
        else render(result);
    });

阻塞隊列選型指南

隊列特性適用場景
ArrayBlockingQueue有界陣列、FIFO固定緩衝區、生產消費速率平衡
LinkedBlockingQueue可選有界鏈表、FIFO預設無界、高吞吐生產消費
PriorityBlockingQueue優先級堆、無界任務優先級調度
DelayQueue延遲堆、無界定時任務、緩存過期清理
SynchronousQueue零容量、直接移交執行緒池 newCachedThreadPool 內部使用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved