摘要:類提供了一個可擴展的線程池實現。使用舉例這里有一個網絡服務,其中一個線程池中的線程為請求提供服務。因此返回的中的每個都是完成狀態。執行給定的一組任務,如果其中一個任務成功完成沒有拋出異常則返回。
Executor
Executor是java.util.concurrent包中的一個接口,是一個執行提交的Runnable任務的對象。這個接口提供了一種方式把任務提交從每個任務會如何執行的方法中解耦,包括線城市用,調度等的細節。使用Executor代替了顯式創建線程。例如,比起對一組task中的每一個調用new Thread(new(RunnableTask())).start(),你可以用:
Executor executor = anExecutor; executor.execute(new RunnableTask1()); executor.execute(new RunnableTask2()); ...
但是,Executor接口不是嚴格需要執行是異步的。在最簡單的情況中,一個executor能夠在調用者的線程上立即運行提交的任務:
class DirectExecutor implements Executor { public void execute(Runnable r) { r.run(); } }
更典型的是,任務執行在非調用者線程。下面的executor為每個task產出一個新的線程:
class ThreadPerTaskExecutor implements Executor { public void execute(Runnable r) { new Thread(r).start(); } }
很多Executor的實現強制加入了一些關于如何以及何時任務被調度的限制。下面的executor串行提交的任務到第二個executor,表明它是一個混合的executor:
class SerialExecutor implements Executor { final Queuetasks = new ArrayDeque (); final Executor executor; Runnable active; SerialExecutor(Executor executor) { this.executor = executor; } public synchronized void execute(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); } } }
在java.util.concurrent包中提供的Executor接口的實現(如ThreadPoolExecutor,ScheduledThreadPoolExecutor,ForkJoinPool,AbstractExecutorService)也同時實現了ExecutorService,這是一個更廣泛的接口。ThreadPoolExecutor類提供了一個可擴展的線程池實現。Executors類為這些Executors提供了方便的工廠方法。
內存一致性效應:線程中在提交一個Runnable對象給一個Executor之前發生的操作happen-before執行這個Runnable(可能在另一個線程中執行)。
實現Executor接口需要實現execute方法,定義如下:
void execute(Runnbale command)
這個方法在未來某個時間點執行給定的command。這個command可能執行在一個新的線程中,在一個池化的線程中,或在調用者線程中,這取決于Executor的實現。
ExecutorServiceExecutorService接口繼承Executor接口,是提供管理終止的方法以及produce出Future去跟蹤一個或多個異步任務進度的方法的Executor。
一個ExecutorService可以被shutdown,會導致它拒絕新的tasks。提供了兩個不同的方法去關閉一個ExecutorService。shutdown方法允許之前提交的任務在終止之前執行,shutdownNow方法禁止等待已經開始任務并試圖結束正在執行的任務。如果一個ExecutorService終止了,一個executor沒有正在執行的活躍任務,沒有等待執行的任務,也沒有新任務能被提交。一個沒有使用的ExecutorService應該被關閉以回收資源。
submit方法根據Executor的execute(Runnable)方法擴展,創建并返回一個Future,能夠用來cancel執行以及等待執行完成。invokeAny方法以及invokeAll方法執行最普通的批量執行,執行一組任務然后等待至少一個,或者所有任務完成。
Executors類為ExecutorService提供工廠方法。
使用舉例這里有一個網絡服務,其中一個線程池中的線程為請求提供服務。它使用預配置的Executors的newFixedThreadPool工廠方法:
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.newFixedTreadPool(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 } }
下面的方法哦通過兩步關閉一個ExecutorService,首先調用shutdown以拒絕新來的tasks,然后調用shutdownNow(如果有必要的話),去cancel任何執行的任務:
void shutdownAndAwaitTermination(ExecutorService pool) { pool.shutdown(); // Disable new tasks from being submitted try { // Wait a while for existing tasks to terminate if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { pool.shutdownNow(); // Cancel currently executing tasks // Wait a while for tasks to respond to being cancelled if (!pool.awaitTermination(60, TimeUnit.SECONDS)) System.err.println("Pool did not terminate"); } } catch (InterruptedException ie) { // (Re-)Cancel if current thread also interrupted pool.shutdownNow(); // Preserve interrupt status Thread.currentThread.interrupt(); } }ExecutorService中定義的方法 shutdown
void shutdown()
啟動有序關閉,執行先前提交的任務,但是不接受新的任務。如果已經關閉再次執行沒有影響。
這個方法不等待先前提交的任務完成執行,使用awaitTermination去等待任務執行完畢。
shutdownNowListshutdownNow()
試圖停止所有正在執行的任務,停止等待任務的處理,返回一個等待執行的任務列表。
這個方法不等待正在執行的任務終止,使用awaitTermination去等待任務終止。
盡力(best-effort)去停止正在執行的任務。例如,標準實現會通過Thread的interrupt去cancel任務,因此任何回應終止失敗的任務永遠不會終止。
isShutdownboolean isShutdown()
如果executor已經被shutdown則返回true。
isTerminatedboolean isTerminated()
如果所有任務在shutdown之后都執行完成則返回true。注意isTerminated永遠不會為true除非shutdown或shutdownNow先執行。
awaitTerminationboolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
在一個shutdown請求后阻塞直到所有任務完成執行,或者timeout發生,或者當前線程被interrupt,看哪個先發生。
submitFuture submit(Callable task)
提交一個返回值的任務去執行并返回一個代表任務掛起結果的Future對象。Future的get方法會返回成功完成的任務結果。
如果你想要立即阻塞等待一個任務完成,你可以使用result = exec.submit(aCallable).get()。
submitFuture submit(Runnable task, T result)
提交一個Runnable任務去執行并返回一個代表這個任務的Future。Future的get方法會返回成功完成的任務結果。
submitFuture> submit(Runnable task)
提交一個Runnable任務去執行并返回一個代表這個任務的Future。Future的get方法會返回成功完成的任務結果null。
invokeAllList > invokeAll(Collection extends Callable > tasks) throws InterruptedException
執行給定的一組任務,返回一個包含這些任務狀態和結果的Future列表。Future的isDone方法對返回列表中的每個元素調用都返回true。
這個方法會阻塞,等待所有task完成。因此返回的list中的每個Future都是完成狀態。
invokeAllList > invokeAll(Collection extends Callable > tasks, long timeout, TimeUnit unit) throws InterruptedException
執行給定的一組任務,返回一個包含這些任務狀態和結果的列表。所有任務完成或timeout超時時方法返回。Future的isDone方法對返回列表中的每個元素調用都返回true。
返回后,沒有完成的任務被cancel。
invokeAnyT invokeAny(Collection extends Callable > tasks) throws InterruptedException, ExcutionException
執行給定的一組任務,如果其中一個任務成功完成(沒有拋出異常)則返回。返回后,所有沒完成的任務都被cancel。
invokeAnyT invokeAny(Collection extends Callable > tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
執行給定的一組任務,如果其中一個任務成功完成(沒有拋出異常)則返回。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75979.html
摘要:線程的啟動與銷毀都與本地線程同步。操作系統會調度所有線程并將它們分配給可用的。框架的成員主要成員線程池接口接口接口以及工具類。創建單個線程的接口與其實現類用于表示異步計算的結果。參考書籍并發編程的藝術方騰飛魏鵬程曉明著 在java中,直接使用線程來異步的執行任務,線程的每次創建與銷毀需要一定的計算機資源開銷。每個任務創建一個線程的話,當任務數量多的時候,則對應的創建銷毀開銷會消耗大量...
摘要:能夠異步的執行任務,并且通常管理一個線程池。這樣我們就不用手動的去創建線程了,線程池中的所有線程都將被重用。在之后不能再提交任務到線程池。它不使用固定大小的線程池,默認情況下是主機的可用內核數。 原文地址: Java 8 Concurrency Tutorial: Threads and Executors Java 5 初次引入了Concurrency API,并在隨后的發布版本中...
摘要:注意線程與本地操作系統的線程是一一映射的。固定線程數的線程池提供了兩種創建具有固定線程數的的方法,固定線程池在初始化時確定其中的線程總數,運行過程中會始終維持線程數量不變。 showImg(https://segmentfault.com/img/bVbhK58?w=1920&h=1080); 本文首發于一世流云專欄:https://segmentfault.com/blog... ...
摘要:在這個示例中我們使用了一個單線程線程池的。在延遲消逝后,任務將會并發執行。這是并發系列教程的第一部分。第一部分線程和執行器第二部分同步和鎖第三部分原子操作和 Java 8 并發教程:線程和執行器 原文:Java 8 Concurrency Tutorial: Threads and Executors 譯者:BlankKelly 來源:Java8并發教程:Threads和Execut...
摘要:有三種狀態運行關閉終止。類類,提供了一系列工廠方法用于創建線程池,返回的線程池都實現了接口。線程池的大小一旦達到最大值就會保持不變,在提交新任務,任務將會進入等待隊列中等待。此線程池支持定時以及周期性執行任務的需求。 這是java高并發系列第19篇文章。 本文主要內容 介紹Executor框架相關內容 介紹Executor 介紹ExecutorService 介紹線程池ThreadP...
閱讀 3920·2021-11-24 10:46
閱讀 1816·2021-11-16 11:44
閱讀 2289·2021-09-22 16:02
閱讀 1401·2019-08-30 15:55
閱讀 1131·2019-08-30 12:46
閱讀 566·2019-08-28 18:31
閱讀 2762·2019-08-26 18:38
閱讀 1094·2019-08-23 16:51