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

J2SE 5.0 java.util.concurrent 核心框架詳解:Executor、Future、線程池、併發集合

     編輯:Java 相關知識

J2SE 5.0 引入 java.util.concurrent 套件,提供高層併發建構元件,解決傳統多執行緒程式設計「難寫、難除錯、難維護」的痛點。本文系統介紹 Executor 框架、排程服務、Future/Callable、ThreadPoolExecutor、併發集合、同步器六大核心組件。

Executor 框架:統一任務提交與執行分離

// 介面定義
public interface Executor {
    void execute(Runnable command);
}

// 同步執行實作
class MySynExecutor implements Executor {
    public void execute(Runnable r) { r.run(); }
}

// 非同步執行實作(每任務一執行緒)
class MyASynExecutor implements Executor {
    public void execute(Runnable r) { new Thread(r).start(); }
}

程式碼只需依賴 Executor 介面,具體執行策略(同步/非同步/線程池/排程)可隨時替換。

ExecutorService:生命週期管理

  • shutdown():停止接受新任務,處理完佇列任務
  • shutdownNow():嘗試中斷執行中任務,返回未處理任務列表
  • awaitTermination():等待終止
  • submit(Runnable/Callable):提交任務並回傳 Future

ScheduledExecutorService:週期性任務神器

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable beeper = () -> System.out.println("beep");
// 1 秒後開始,每 5 秒執行一次
ScheduledFuture handle = scheduler.scheduleAtFixedRate(beeper, 1, 5, TimeUnit.SECONDS);
// 取消:handle.cancel(true);

適用:定期清理暫存檔、心跳檢測、資料同步等。

Future & Callable:從執行緒取得回傳值

舊版 run() 回傳 void,取值極麻煩。Callable 回傳 V,配合 Future:

Future future = executor.submit(() -> {
    // 耗時運算...
    return "result";
});

// 主執行緒可輪詢
while (!future.isDone()) { Thread.sleep(500); }
String result = future.get();  // 阻塞直到完成

FutureTask 實作 RunnableFuture,可直接提交給 Executor。

ThreadPoolExecutor:生產級線程池完整控制

參數說明
corePoolSize核心線程數(常駐)
maximumPoolSize最大線程數
keepAliveTime非核心線程閒置存活時間
workQueue任務佇列(有界/無界)
threadFactory線程建立工廠(命名、優先權、Daemon)
RejectedExecutionHandler拒絕策略(Abort/Discard/CallerRuns)

排隊規則:

  1. 執行中 < corePoolSize → 新建線程
  2. ≥ corePoolSize → 入佇列
  3. 佇列滿且 < maximumPoolSize → 新建線程
  4. 佇列滿且 ≥ maximumPoolSize → 拒絕策略

Hook 方法:beforeExecute()/afterExecute()(需繼承覆寫),適合監控、日誌、計時。

併發集合:為多執行緒優化

類別特性適用場景
ConcurrentHashMap分段鎖,高併發讀寫快取、計數器、註冊表
CopyOnWriteArrayList寫入複製底層陣列讀多寫少、遍歷無需鎖
CopyOnWriteArraySet同上,Set 語意事件監聽器清單等

迭代器提供快照視圖:迭代過程不受並發修改影響,不拋 ConcurrentModificationException。

進階同步器(略)

  • Semaphore:信號量,控制同時存取數
  • CountDownLatch:倒數閂,等待 N 個事件完成
  • CyclicBarrier:循環柵欄,固定執行緒集合同步點
  • Exchanger:雙方交換資料

需配合併發理論背景使用,文末附參考資源。

總結

有了 java.util.concurrent,不再需要手寫 wait/notify、線程池、佇列。標準化、高效能、經實戰驗證的組件,讓多執行緒開發從「挑戰」變成「工程」。

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