concurrent包與執行緒池
1.繼承體系
starUML執行異常,和c盤儲存或目錄層次有關
2.API說明和經典例子
以下文字摘自Executor介面的Java API文件:
。此介面提供一種將任務提交與每個任務將如何執行的機制(包括執行緒使用的細節、排程等)分離開來的方法。通常使用Executor 而不是顯式地建立執行緒。例如,可能會使用以下方法,而不是為一組任務中的每個任務呼叫 new Thread(new(RunnableTask())).start():
Executor executor = anExecutor; executor.execute(new RunnableTask1()); executor.execute(new RunnableTask2()); ...
class DirectExecutor implements Executor { public void execute(Runnable r) { r.run(); } }更常見的是,任務是在某個不是呼叫者執行緒的執行緒中執行的。以下執行程式將為每個任務生成一個新執行緒。
class ThreadPerTaskExecutor implements Executor { public void execute(Runnable r) { new Thread(r).start();許多 Executor 實現都對排程任務的方式和時間強加了某種限制。以下執行程式使任務提交與第二個執行程式保持連續,這說明了一個複合執行程式。} }
class SerialExecutor implements Executor { final Queue<Runnable> tasks = new ArrayDeque<Runnable>(); final Executor executor; Runnable active; SerialExecutor(Executor executor) { this.executor = executor; } public synchronized void execute此包中提供的 Executor 實現實現了。(final Runnable r) { tasks.offer(new Runnable() { public void run() { try { r.run(); } finally { scheduleNext(); } } }); if (active == null) { scheduleNext(); } } protected synchronized void scheduleNext() { if ((active = tasks.poll()) != null) { executor.execute(active); } } }
ThreadPoolExecutor
類提供一個可擴充套件的執行緒池實現。Executors
類為這些 Executor 提供了便捷的工廠方法。
記憶體一致性效果:執行緒中將 Runnable
物件提交到 Executor
之前的操作
happen-before 其執行開始(可能在另一個執行緒中)。
- 從以下版本開始:
- 1.5
以下文字摘自ExecutorService的Java API文件:
Executor
提供了管理終止的方法,以及可為跟蹤一個或多個非同步任務執行狀況而
的方法。
可以關閉 ExecutorService,這將導致其拒絕新任務。提供兩個方法來關閉 ExecutorService。在終止前允許執行以前提交的任務,而阻止等待任務啟動並試圖停止當前正在執行的任務。在終止時,執行程式沒有任務在執行,也沒有任務在等待執行,並且無法提交新任務。應該關閉未使用的ExecutorService 以允許回收其資源。
通過建立並返回一個可用於取消執行和/或等待完成的
Future
,方法 submit 擴充套件了基本方法
Executor.execute(java.lang.Runnable)
。方法 invokeAny 和invokeAll 是批量執行的最常用形式,它們執行任務 collection,然後等待至少一個,或全部任務完成(可使用
ExecutorCompletionService
類來編寫這些方法的自定義變體)。
提供了用於此包中所提供的執行程式服務的工廠方法。
用法示例
下面給出了一個網路服務的簡單結構,這裡執行緒池中的執行緒作為傳入的請求。它使用了:class NetworkService implements Runnable { private final ServerSocket serverSocket; private final ExecutorService pool; public NetworkService(int port, int poolSize) throws IOException { serverSocket = new ServerSocket(port); pool = Executors.newFixedThreadPool(poolSize); } public void run() { // run the service try { for (;;) { pool.execute(new Handler(serverSocket.accept())); } } catch (IOException ex) { pool.shutdown(); } } } class Handler implements Runnable { private final Socket socket; Handler(Socket socket) { this.socket = socket; } public void run() { // read and service request on socket } }
3.具體知識點與簡單例子
以下是ExecutorService啟動多執行緒執行任務的最簡單用法,摘自Java程式設計思想:
不同的執行緒池: