J2SE 5.0 (java.util.concurrent) 提供生產級並發組件,替代手工管理 Thread 的低級錯誤易發模式。核心包含:高效靈活的線程池、非同步任務框架、優化併發存取的集合類、進階同步器。
// 同步執行 (當前線程直接跑)
class MySynExecutor implements Executor {
public void execute(Runnable r) { r.run(); }
}
// 非同步執行 (新線程跑)
class MyASynExecutor implements Executor {
public void execute(Runnable r) { new Thread(r).start(); }
}
統一了任務提交入口,解耦提交邏輯與執行策略。
shutdown():停止接受新任務,等待進行中任務完成。shutdownNow():嘗試中斷執行中任務,返回未執行任務列表。最實用的組件之一。支援固定頻率/固定延遲執行,適用於清理暫存檔、心跳檢測等。
Runnable beeper = () -> System.out.println("beep");
ScheduledFuture> handle = scheduler.scheduleAtFixedRate(beeper, 1, 5, TimeUnit.SECONDS);
解決傳統 run() 無返回值、難以查詢進度的痛點。
Future:isDone() 檢查完成、get() 阻塞取結果、cancel() 取消。FutureTask:Future 預設實作,可包裝 Callable。FutureTask future = new FutureTask<>(() -> {
// 耗時運算並返回結果
return "result";
});
executor.execute(future);
// 主線程可輪詢或阻塞等待
while (!future.isDone()) { /* 做其他事 */ }
String result = future.get();
| 參數 | 說明 |
|---|---|
| corePoolSize / maximumPoolSize | 核心/最大線程數。相等=固定大小;最大設 Integer.MAX_VALUE=無界。 |
| keepAliveTime | 非核心線程閒置存活時間。 |
| 工作佇列 | BlockingQueue 實作 (ArrayBlockingQueue, LinkedBlockingQueue, SynchronousQueue 等),決定排隊策略。 |
| ThreadFactory | 自定義線程建立 (命名、優先級、守護線程)。 |
| RejectedExecutionHandler | 拒絕策略 (Abort/Discard/CallerRuns 等)。 |
排隊規則:
Hook 方法:beforeExecute()/afterExecute() (需繼承覆寫),可用於監控、日誌、計時。
| 類別 | 特點 | 適用場景 |
|---|---|---|
| ConcurrentHashMap | 分段鎖 (JDK 7) / CAS+synchronized (JDK 8+),高併發讀寫 | 共享快取、計數器、註冊表 |
| CopyOnWriteArrayList | 寫入時複製底層陣列,讀取無鎖極快 | 讀多寫少、遍歷頻繁 (如事件監聽器列表) |
| CopyOnWriteArraySet | 同上,Set 語意 | 唯一性集合、訂閱者管理 |
迭代器提供快照語意:建立迭代器時凍結視圖,後續修改不影響迭代,避免 ConcurrentModificationException。
這些組件建立在 AQS (AbstractQueuedSynchronizer) 之上,掌握它們能構建複雜協調邏輯。
Java 5 並發包將「寫正確的多執行緒程式」從專家領域降維至工程師日常。善用 ExecutorService 管理線程生命週期、Future 處理異步結果、ConcurrentHashMap 替代同步 Map、ScheduledExecutorService 替代 Timer,即可消除 90% 的併發 Bug。進階同步器則為複雜協調場景提供精準工具。說服團隊拥抱多執行緒,從引入這些類開始。