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