摘要:而中直接將任務交給運行再來看創建一個保存所有的結果運行任務依次取結果這里使用是為了等待運行完成,如果沒完成就會阻塞如果發生異常,則取消所有任務續線程池的原理學習二
Executor接口
如果查看jdk文檔,會發現java線程池都源自于這個超級接口Executor,但是這個接口本身比較簡單:
public interface Executor { /** 在未來某個時間執行給定的命令。該命令可能在新的線程、已入池的線程或者正調用的線程中執行, 這由 Executor 實現決定。 * * @param command the runnable task * @throws RejectedExecutionException if this task cannot be * accepted for execution. * @throws NullPointerException if command is null */ void execute(Runnable command); }
可以看到Executor 中只有一個execute 方法。此接口提供一種將任務提交與每個任務將如何運行的機制分離開來的方法,相比較為每個人物調用new Thread(Runnable r).start() ,我們更偏向于使用Executor (執行器)來運行任務:
Executor executor = anExecutor; executor.execute(new RunnableTask1()); executor.execute(new RunnableTask2()); ...
實現一個執行器也很簡單:
class ThreadPerTaskExecutor implements Executor { public void execute(Runnable r) { new Thread(r).start(); } }ExecutorService接口
Executor 提供的方法太少了!根本不能滿足日常所需,而從它派生下來的接口ExecutorService 則顯得更通用,畢竟它也是個Service。
public interface ExecutorService extends Executor { void shutdown(); ListshutdownNow(); boolean isShutdown(); boolean isTerminated(); boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException; Future submit(Callable task); Future submit(Runnable task, T result); Future> submit(Runnable task); List > invokeAll(Collection extends Callable > tasks) throws InterruptedException; T invokeAny(Collection extends Callable > tasks) throws InterruptedException, ExecutionException; ... }
可以看到,ExecutorService 接口中包含了我們平常使用的線程池的絕大多數方法,其中的一些方法在上文已經介紹過了。
AbstractExecutorServiceAbstractExecutorService是一個抽象類,并且實現了ExecutorService接口。
public abstract class AbstractExecutorService implements ExecutorService
在這個類中,提供了ExecutorService 一些方法的默認實現,比如submit ,invokeAll ,首先看submit 的實現:
publicFuture submit(Callable task) { if (task == null) throw new NullPointerException(); RunnableFuture ftask = newTaskFor(task); execute(ftask); return ftask; }
其中使用了newTaskFor 方法:
protectedRunnableFuture newTaskFor(Callable callable) { return new FutureTask (callable); }
newTaskFor 方法只是簡單的將給定可調用任務包裝成一個RunnableFuture ,使其具有取消運行的特性。而submit 中直接將任務交給execute() 運行.
再來看invokeAll() :
publicList > invokeAll(Collection extends Callable > tasks) throws InterruptedException { if (tasks == null) throw new NullPointerException(); //創建一個list保存所有的結果 List > futures = new ArrayList >(tasks.size()); boolean done = false; try { for (Callable t : tasks) { RunnableFuture f = newTaskFor(t); futures.add(f); execute(f); //運行任務 } for (Future f : futures) { if (!f.isDone()) { //依次取結果 try { f.get(); //這里使用get是為了等待運行完成,如果沒完成就會阻塞 } catch (CancellationException ignore) { } catch (ExecutionException ignore) { } } } done = true; return futures; } finally { if (!done) //如果發生異常,則取消所有任務 for (Future f : futures) f.cancel(true); } }
續:java線程池的原理學習(二)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64434.html
摘要:接上文線程池的原理學習二深入剖析線程池的五種狀態類中將線程狀態分為了以下五種可以接受新任務并且處理進入隊列中的任務不接受新任務,但是仍然執行隊列中的任務不接受新任務也不執行隊列中的任務所有任務中止,隊列為空,進入該狀態下的任務會執行方法方法 接上文:java線程池的原理學習(二) ThreadPoolExecutor深入剖析 線程池的五種狀態 ThreadPoolExecutor 類中...
摘要:當活動線程核心線程非核心線程達到這個數值后,后續任務將會根據來進行拒絕策略處理。線程池工作原則當線程池中線程數量小于則創建線程,并處理請求。當線程池中的數量等于最大線程數時默默丟棄不能執行的新加任務,不報任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點記錄以及采用的解決方案 深入分析 java 線程池的實現原理 在這篇文章中,作者有條不紊的將 ja...
摘要:接上文線程池的原理學習簡單介紹,線程池類,繼承自構造方法提供了四種構造方法實現這里只介紹一種有必要對每個參數解釋一下池中所保存的線程數,包括空閑線程。文檔中提供了一個可以暫停和恢復的線程池例子運行原理線程池的原理學習三 接上文:java線程池的原理學習 ThreadPoolExecutor簡單介紹 ThreadPoolExecutor,線程池類,繼承自 AbstractExecutor...
摘要:線程池的工作原理一個線程池管理了一組工作線程,同時它還包括了一個用于放置等待執行任務的任務隊列阻塞隊列。使用線程池可以對線程進行統一的分配和監控。線程池的注意事項雖然線程池是構建多線程應用程序的強大機制,但使用它并不是沒有風險的。 線程池的工作原理一個線程池管理了一組工作線程, 同時它還包括了一個用于放置等待執行 任務的任務隊列(阻塞隊列) 。 一個線程池管理了一組工作線程, 同時它還...
摘要:每個通過網絡到達服務器的連接都被包裝成一個任務并且傳遞給線程池。線程池的線程會并發的處理連接上的請求。用線程池控制線程數量,其他線程排隊等候。實現包,線程池頂級接口是但是嚴格意義講并不是一個線程。此線程池支持定時以及周期性執行任務的需求。 tutorial site1tutorial site2 一個問題: 每啟動一個新線程都會有相應的性能開銷(涉及到OS的交互:創建線程,銷毀線程...
閱讀 3917·2021-09-09 09:33
閱讀 1773·2021-09-06 15:14
閱讀 1919·2019-08-30 15:44
閱讀 3074·2019-08-29 18:36
閱讀 3765·2019-08-29 16:22
閱讀 2095·2019-08-29 16:21
閱讀 2530·2019-08-29 15:42
閱讀 1648·2019-08-29 11:00