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

Java 5 並發包核心組件詳解:Executor 框架、Future、線程池與並發集合

     編輯:Java 相關知識

背景:JSR 166 引入高階並發工具

J2SE 5.0 (java.util.concurrent) 提供生產級並發組件,替代手工管理 Thread 的低級錯誤易發模式。核心包含:高效靈活的線程池、非同步任務框架、優化併發存取的集合類、進階同步器。

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

Executor 接口

// 同步執行 (當前線程直接跑)
class MySynExecutor implements Executor {
  public void execute(Runnable r) { r.run(); }
}

// 非同步執行 (新線程跑)
class MyASynExecutor implements Executor {
  public void execute(Runnable r) { new Thread(r).start(); }
}

統一了任務提交入口,解耦提交邏輯與執行策略。

ExecutorService:生命週期管理

  • shutdown():停止接受新任務,等待進行中任務完成。
  • shutdownNow():嘗試中斷執行中任務,返回未執行任務列表。
  • 示例:固定大小 3 的線程池,提交任務滿載後關閉,10 秒後強制終止。

ScheduledExecutorService:週期性任務調度

最實用的組件之一。支援固定頻率/固定延遲執行,適用於清理暫存檔、心跳檢測等。

Runnable beeper = () -> System.out.println("beep");
ScheduledFuture handle = scheduler.scheduleAtFixedRate(beeper, 1, 5, TimeUnit.SECONDS);

Future / FutureTask:異步結果獲取

解決傳統 run() 無返回值、難以查詢進度的痛點。

  • Future:isDone() 檢查完成、get() 阻塞取結果、cancel() 取消。
  • FutureTask:Future 預設實作,可包裝 Callable。
FutureTask future = new FutureTask<>(() -> {
  // 耗時運算並返回結果
  return "result";
});
executor.execute(future);

// 主線程可輪詢或阻塞等待
while (!future.isDone()) { /* 做其他事 */ }
String result = future.get();

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

參數說明
corePoolSize / maximumPoolSize核心/最大線程數。相等=固定大小;最大設 Integer.MAX_VALUE=無界。
keepAliveTime非核心線程閒置存活時間。
工作佇列BlockingQueue 實作 (ArrayBlockingQueue, LinkedBlockingQueue, SynchronousQueue 等),決定排隊策略。
ThreadFactory自定義線程建立 (命名、優先級、守護線程)。
RejectedExecutionHandler拒絕策略 (Abort/Discard/CallerRuns 等)。

排隊規則:

  1. 運行線程 < corePoolSize → 新建線程不入隊。
  2. 運行線程 ≥ corePoolSize → 入隊。
  3. 隊列滿 → 新建線程 (未超過 maximumPoolSize)。
  4. 超過最大 → 執行拒絕策略。

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

並發集合:為多執行緒設計的高效容器

類別特點適用場景
ConcurrentHashMap分段鎖 (JDK 7) / CAS+synchronized (JDK 8+),高併發讀寫共享快取、計數器、註冊表
CopyOnWriteArrayList寫入時複製底層陣列,讀取無鎖極快讀多寫少、遍歷頻繁 (如事件監聽器列表)
CopyOnWriteArraySet同上,Set 語意唯一性集合、訂閱者管理

迭代器提供快照語意:建立迭代器時凍結視圖,後續修改不影響迭代,避免 ConcurrentModificationException。

進階同步器 (簡介)

  • Semaphore:計數信號量,控制同時存取資源的線程數。
  • CountDownLatch:倒數閂,等待 N 個事件完成再繼續。
  • CyclicBarrier:循環柵欄,N 個線程互相等待齊聚再並行。
  • Exchanger:雙線程資料交換點。

這些組件建立在 AQS (AbstractQueuedSynchronizer) 之上,掌握它們能構建複雜協調邏輯。

結語

Java 5 並發包將「寫正確的多執行緒程式」從專家領域降維至工程師日常。善用 ExecutorService 管理線程生命週期、Future 處理異步結果、ConcurrentHashMap 替代同步 Map、ScheduledExecutorService 替代 Timer,即可消除 90% 的併發 Bug。進階同步器則為複雜協調場景提供精準工具。說服團隊拥抱多執行緒,從引入這些類開始。

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