有一道經典練習題:使用 4 個線程並行計算表達式 (1234*7856)+(50000/5432)+(2^10)+(9834-298*345) 的結果。題目提示使用線程池實現。
雖然可以定義四個獨立的 Runnable 任務,但更簡潔的方式是利用 ExecutorService 提交 4 個 Callable 任務,每個任務計算一個加數,最後主線程通過 Future.get() 彙總結果。
ExecutorService executor = Executors.newFixedThreadPool(4);
List> futures = new ArrayList<>();
futures.add(executor.submit(() -> 1234 * 7856));
futures.add(executor.submit(() -> 50000 / 5432));
futures.add(executor.submit(() -> (int) Math.pow(2, 10)));
futures.add(executor.submit(() -> 9834 - 298 * 345));
int sum = 0;
for (Future f : futures) {
sum += f.get(); // 阻塞等待結果
}
executor.shutdown();
System.out.println("總和: " + sum);
雖然這能演示線程池用法,但專家指出:這根本不是演示多線程的好場景。任務極其輕量,線程創建、調度、上下文切換的開銷遠大於計算本身,如同「在田徑場讓噴氣飛機演示飛行」。真實場景應為耗時 I/O 或複雜計算任務。
ThreadPoolExecutor 自定義核心參數,而非 Executors 預設工廠。CompletableFuture 進行組合式異步編程(Java 8+)。