ExecutorService擴(kuò)展和實(shí)現(xiàn)Executor谨湘。
java 線程池的5種狀態(tài)
RUNNING 線程池處在RUNNING狀態(tài)時(shí)拨脉,能夠接收新任務(wù),以及對(duì)已添加的任務(wù)進(jìn)行處理
SHUTDOWN 線程池處在SHUTDOWN狀態(tài)時(shí)帖池,不接收新任務(wù)年扩,但能處理已添加的任務(wù);調(diào)用線程池的shutdown()接口時(shí)盾剩,線程池由RUNNING -> SHUTDOWN
STOP 線程池處在STOP狀態(tài)時(shí)雷激,不接收新任務(wù),不處理已添加的任務(wù)彪腔,并且會(huì)中斷正在處理的任務(wù);調(diào)用線程池的shutdownNow()接口時(shí)侥锦,線程池由(RUNNING or SHUTDOWN ) -> STOP
TIDYING 當(dāng)所有的任務(wù)已終止,ctl記錄的”任務(wù)數(shù)量”為0德挣,線程池會(huì)變?yōu)門(mén)IDYING狀態(tài);當(dāng)線程池在SHUTDOWN狀態(tài)下恭垦,阻塞隊(duì)列為空并且線程池中執(zhí)行的任務(wù)也為空時(shí),就會(huì)由 SHUTDOWN -> TIDYING格嗅。當(dāng)線程池在STOP狀態(tài)下番挺,線程池中執(zhí)行的任務(wù)為空時(shí),就會(huì)由STOP -> TIDYING
TERMINATED 線程池徹底終止屯掖,就變成TERMINATED狀態(tài)玄柏。 線程池處在TIDYING狀態(tài)時(shí)浑娜,執(zhí)行完terminated()之后豺型,就會(huì)由 TIDYING -> TERMINATED
Java線程的6種狀態(tài)及切換
初始(NEW):新創(chuàng)建了一個(gè)線程對(duì)象,但還沒(méi)有調(diào)用start()方法。
運(yùn)行(RUNNABLE):Java線程中將就緒(ready)和運(yùn)行中(running)兩種狀態(tài)籠統(tǒng)的稱(chēng)為“運(yùn)行”透且。線程對(duì)象創(chuàng)建后匕荸,其他線程(比如main線程)調(diào)用了該對(duì)象的start()方法懂昂。該狀態(tài)的線程位于可運(yùn)行線程池中净嘀,等待被線程調(diào)度選中,獲取CPU的使用權(quán)椎咧,此時(shí)處于就緒狀態(tài)(ready)玖详。就緒狀態(tài)的線程在獲得CPU時(shí)間片后變?yōu)檫\(yùn)行中狀態(tài)(running)。
阻塞(BLOCKED):表示線程阻塞于鎖勤讽。
等待(WAITING):進(jìn)入該狀態(tài)的線程需要等待其他線程做出一些特定動(dòng)作(通知或中斷)蟋座。
超時(shí)等待(TIMED_WAITING):該狀態(tài)不同于WAITING,它可以在指定的時(shí)間后自行返回脚牍。
終止(TERMINATED):表示該線程已經(jīng)執(zhí)行完畢向臀。
ExecutorService分析
public interface ExecutorService extends Executor{
//1 調(diào)用方法前提交的任務(wù)會(huì)執(zhí)行
//2 調(diào)用方法后在提交任務(wù)會(huì)被拒絕
//3 ExecutorService已經(jīng)關(guān)閉了 調(diào)用沒(méi)有任何影響
//4 所有線程執(zhí)行完當(dāng)前的任務(wù),ExecutorService才會(huì)真正關(guān)閉
//5 線程池的狀態(tài)切換 SHUTDOWN
void shutdown();
//1 嘗試停止所有正在執(zhí)行的任務(wù)
//2 停止等待任務(wù)的處理
//3 返回等待執(zhí)行的任務(wù)列表
//4 線程池狀態(tài)設(shè)置STOP狀態(tài)
//5 通過(guò)Thread的 interrupt方法停止執(zhí)行的任務(wù)莫矗, 所以任何無(wú)法響應(yīng)中斷的任務(wù)都可能永遠(yuǎn)不會(huì)終止飒硅。
List<Runnable> shutdownNow();
//Returns true if this executor has been shut down
boolean isShutdown();
// return true if all tasks have completed following shut down.如果在調(diào)用這個(gè)方法之前,沒(méi)有調(diào)用過(guò)shutdown 或shutdownNow作谚,永遠(yuǎn)不會(huì)反悔true
boolean isTerminated();
//當(dāng)前線程阻塞
//直到shutdown后等所有在執(zhí)行的任務(wù)執(zhí)行完
//等超時(shí)時(shí)間到
//或者線程被中斷
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
//Future get方法可以獲得任務(wù)成功后的值
//如果想阻塞等待任務(wù)執(zhí)行的結(jié)果,可以result = exec.submit(aCallable).get();
<T> Future<T> submit(Callable<T> task);
//任務(wù)成功后 get可以獲取返回值
<T> Future<T> submit(Runnable task, T result);
// 任務(wù)成功后 get返回null
Future<?> submit(Runnable task);
//堵塞 等所有任務(wù)執(zhí)行完成后統(tǒng)一返回
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
//堵塞 等所有任務(wù)執(zhí)行完成后統(tǒng)一返回庵芭, 設(shè)置超時(shí)時(shí)間 是所以任務(wù)一起的超時(shí)時(shí)間妹懒,超時(shí)會(huì)取消所有沒(méi)有執(zhí)行完的任務(wù)
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException;
//執(zhí)行給定的任務(wù),只要有一個(gè)任務(wù)成功執(zhí)行完成双吆,就返回結(jié)果眨唬。不包過(guò)異常。
// 正常返回和異常返回后好乐,沒(méi)有完成的任務(wù)將被取消
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException;
//同上 增加一個(gè)超時(shí)的時(shí)間
<T> T invokeAny(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}