Executor介面提供任務執行機制,而ThreadPool是其實現,管理執行緒池來執行任務。 ThreadPool使用Executors工具類別創建,如newFixedThreadPool(),並使用execute()方法提交任務。在實戰案例中,使用ExecutorService和ThreadPool計算數位平方和,以展示平行程式設計的使用方式。注意事項包括平衡執行緒池大小和任務數量,避免異常拋出,並在使用後關閉ThreadPool。
Java並行程式設計中的Executor和ThreadPool使用指南
在Java中實作並行程式設計時,Executor
和ThreadPool
是兩大核心概念。在本教程中,我們將深入探討這兩種機制,並透過實戰案例示範如何使用它們。
Executor
Executor
介面代表一個任務執行機制。它提供了一個通用的方法execute()
,用於提交任務執行。透過實作Executor
接口,可以自訂任務的執行方式,例如,建立自訂的執行緒池或使用現成的執行緒池。
public class CustomExecutor implements Executor { @Override public void execute(Runnable command) { // 自定义任务执行逻辑 // ... } }
ThreadPool
ThreadPool
是Executor
的一個實現,提供了一組執行緒來並行執行任務。它管理執行緒的生命週期,確保同時執行的任務數量不會超過執行緒池大小。
可以使用Executors
工具類別建立執行緒池,例如newFixedThreadPool()
和newCachedThreadPool()
:
ExecutorService threadPool = Executors.newFixedThreadPool(5); threadPool.execute(new Runnable() { @Override public void run() { // 任务代码 } });
實戰案例
計算數字平方
考慮一個並行計算數字平方和的場景。我們可以使用Executor
和ThreadPool
實作如下:
import java.util.Arrays; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SquareSum { private static int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; public static void main(String[] args) { ExecutorService threadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); long sum = 0; for (int number : numbers) { threadPool.execute(() -> sum += Math.pow(number, 2)); } threadPool.shutdown(); while (!threadPool.isTerminated()) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Square sum: " + sum); } }
在這個案例中,Executors.newFixedThreadPool()
建立了一個執行緒池,其大小與可用處理器的數量相符。然後,任務被提交到線程池,並行計算每個數字的平方。最後,shutdown()
方法關閉了執行緒池,並等待所有任務完成。
注意事項
ThreadPool
時,應注意執行緒池大小和任務數量的平衡。執行緒池過大可能導致資源浪費,而執行緒池過小可能導致效能瓶頸。 Executor
的任務不應拋出例外。如果一個任務拋出異常,Executor
可能會失敗,導致所有其他任務無法執行。 ThreadPool
後,應使用shutdown()
方法關閉執行緒池,以確保所有執行緒都已停止。 以上是Java並行程式設計中Executor和ThreadPool的用法解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!