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

J2SE 5.0 並發套件核心組件詳解(一):從 Executor 到 Future 的完整體系

     編輯:J2SE

並發工具包整體架構

J2SE 5.0 java.util.concurrent 建立在三大支柱之上:

  1. 執行框架:Executor → ExecutorService → ScheduledExecutorService、ThreadPoolExecutor
  2. 非同步結果:Future、FutureTask、CompletionService
  3. 並發資料結構與同步器:Concurrent Collections、Locks、Synchronizers

Executor 體系演進

Executor:最小介面

單一方法 execute(Runnable),隱藏執行緒建立、排程、池化細節。

ExecutorService:生命週期與結果

  • submit(Callable) → Future:可獲取結果、檢查狀態、取消
  • invokeAll/InvokeAny:批次任務協調
  • shutdown/shutdownNow/awaitTermination:優雅停機協議

ScheduledExecutorService:時間維度

schedule(task, delay, unit)              // 一次性延遲
scheduleAtFixedRate(task, init, period)  // 固定頻率(開始時間間隔)
scheduleWithFixedDelay(task, init, delay) // 固定延遲(結束到下次開始)

ThreadPoolExecutor:完全可控

七參數構造函數提供工業級配置能力(詳見進階篇)。

Future 與 FutureTask:非同步計算契約

Future 介面核心契約

  • boolean cancel(boolean mayInterruptIfRunning):嘗試取消
  • boolean isCancelled():是否已取消
  • boolean isDone():是否完成(正常/異常/取消)
  • V get() / get(timeout, unit):阻塞獲取結果或拋出異常

FutureTask:Runnable + Future 雙重身分

// 包裝 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 ThreadThreadPoolExecutor執行緒復用、任務隊列緩衝
Future/PromiseFuture/FutureTask非同步結果佔位、狀態查詢
SchedulerScheduledExecutorService時間觸發、週期執行
Completion ServiceExecutorCompletionService完成順序獲取結果、生產者-消費者

遷移建議

  • 舊代碼 new Thread(r).start() → executor.execute(r)
  • 需結果的 Thread + join() → FutureTask + get()
  • 定時器 Timer → ScheduledExecutorService(支援執行緒池、異常不停止)
  • 自旋等待標誌位 → CountDownLatch/Future.isDone()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved