J2SE 5.0 java.util.concurrent 建立在三大支柱之上:
Executor → ExecutorService → ScheduledExecutorService、ThreadPoolExecutorFuture、FutureTask、CompletionService單一方法 execute(Runnable),隱藏執行緒建立、排程、池化細節。
submit(Callable) → Future:可獲取結果、檢查狀態、取消invokeAll/InvokeAny:批次任務協調shutdown/shutdownNow/awaitTermination:優雅停機協議schedule(task, delay, unit) // 一次性延遲
scheduleAtFixedRate(task, init, period) // 固定頻率(開始時間間隔)
scheduleWithFixedDelay(task, init, delay) // 固定延遲(結束到下次開始)
七參數構造函數提供工業級配置能力(詳見進階篇)。
boolean cancel(boolean mayInterruptIfRunning):嘗試取消boolean isCancelled():是否已取消boolean isDone():是否完成(正常/異常/取消)V get() / get(timeout, unit):阻塞獲取結果或拋出異常// 包裝 Callable
FutureTask task = new FutureTask<>(() -> {
Thread.sleep(1000);
return "Done";
});
executor.execute(task); // 作為 Runnable 提交
// 其他工作...
String result = task.get(); // 阻塞等待結果
// 超時獲取
try {
String result = future.get(2, TimeUnit.SECONDS);
} catch (TimeoutException e) {
future.cancel(true); // 中斷執行中任務
// 降級處理
}
// 組合多個 Future(Java 8 CompletableFuture 更優雅)
List> futures = executor.invokeAll(tasks);
for (Future f : futures) {
try { results.add(f.get()); }
catch (ExecutionException e) { /* 處理任務異常 */ }
}
public class StringReverser implements Callable {
private final String input;
public StringReverser(String s) { this.input = s; }
@Override public String call() {
StringBuilder sb = new StringBuilder(input).reverse();
// 模擬漸進式處理
for (int i = 0; i < sb.length(); i++) {
Thread.sleep(1000); // 每秒處理一字元
}
return sb.toString();
}
}
// 使用
FutureTask task = new FutureTask<>(new StringReverser("Hello"));
executor.execute(task);
while (!task.isDone()) {
System.out.println("任務進行中...");
Thread.sleep(500);
}
System.out.println("結果: " + task.get());
| 模式 | 對應組件 | 核心價值 |
|---|---|---|
| Worker Thread | ThreadPoolExecutor | 執行緒復用、任務隊列緩衝 |
| Future/Promise | Future/FutureTask | 非同步結果佔位、狀態查詢 |
| Scheduler | ScheduledExecutorService | 時間觸發、週期執行 |
| Completion Service | ExecutorCompletionService | 完成順序獲取結果、生產者-消費者 |
new Thread(r).start() → executor.execute(r)Thread + join() → FutureTask + get()Timer → ScheduledExecutorService(支援執行緒池、異常不停止)CountDownLatch/Future.isDone()