我們知道線程是有多種執(zhí)行狀態(tài)的,同樣管理線程的線程池也有多種狀態(tài)。JVM會(huì)在所有線程(非后臺(tái)daemon線程)全部終止后才退出,為了節(jié)省資源和有效釋放資源關(guān)閉一個(gè)線程池就顯得很重要。有時(shí)候無(wú)法正確的關(guān)閉線程池,將會(huì)阻止JVM的結(jié)束。
線程池Executor是異步的執(zhí)行任務(wù),因此任何時(shí)刻不能夠直接獲取提交的任務(wù)的狀態(tài)。這些任務(wù)有可能已經(jīng)完成,也有可能正在執(zhí)行或者還在排隊(duì)等待執(zhí)行。因此關(guān)閉線程池可能出現(xiàn)一下幾種情況:
- 平緩關(guān)閉:已經(jīng)啟動(dòng)的任務(wù)全部執(zhí)行完畢,同時(shí)不再接受新的任務(wù)
- 立即關(guān)閉:取消所有正在執(zhí)行和未執(zhí)行的任務(wù)
另外關(guān)閉線程池后對(duì)于任務(wù)的狀態(tài)應(yīng)該有相應(yīng)的反饋信息。
圖1 描述了線程池的4種狀態(tài)。
- 線程池在構(gòu)造前(new操作)是初始狀態(tài),一旦構(gòu)造完成線程池就進(jìn)入了執(zhí)行狀態(tài)RUNNING。嚴(yán)格意義上講線程池構(gòu)造完成后并沒(méi)有線程被立即啟動(dòng),只有進(jìn)行“預(yù)啟動(dòng)”或者接收到任務(wù)的時(shí)候才會(huì)啟動(dòng)線程。這個(gè)會(huì)后面線程池的原理會(huì)詳細(xì)分析。但是線程池是出于運(yùn)行狀態(tài),隨時(shí)準(zhǔn)備接受任務(wù)來(lái)執(zhí)行。
- 線程池運(yùn)行中可以通過(guò)shutdown()和shutdownNow()來(lái)改變運(yùn)行狀態(tài)。shutdown()是一個(gè)平緩的關(guān)閉過(guò)程,線程池停止接受新的任務(wù),同時(shí)等待已經(jīng)提交的任務(wù)執(zhí)行完畢,包括那些進(jìn)入隊(duì)列還沒(méi)有開(kāi)始的任務(wù),這時(shí)候線程池處于SHUTDOWN狀態(tài);shutdownNow()是一個(gè)立即關(guān)閉過(guò)程,線程池停止接受新的任務(wù),同時(shí)線程池取消所有執(zhí)行的任務(wù)和已經(jīng)進(jìn)入隊(duì)列但是還沒(méi)有執(zhí)行的任務(wù),這時(shí)候線程池處于STOP狀態(tài)。
- 一旦shutdown()或者shutdownNow()執(zhí)行完畢,線程池就進(jìn)入TERMINATED狀態(tài),此時(shí)線程池就結(jié)束了。
- isTerminating()描述的是SHUTDOWN和STOP兩種狀態(tài)。
- isShutdown()描述的是非RUNNING狀態(tài),也就是SHUTDOWN/STOP/TERMINATED三種狀態(tài)。

圖1
線程池的API如下:

圖2
其中shutdownNow()會(huì)返回那些已經(jīng)進(jìn)入了隊(duì)列但是還沒(méi)有執(zhí)行的任務(wù)列表。awaitTermination描述的是等待線程池關(guān)閉的時(shí)間,如果等待時(shí)間線程池還沒(méi)有關(guān)閉將會(huì)拋出一個(gè)超時(shí)異常。
對(duì)于關(guān)閉線程池期間發(fā)生的任務(wù)提交情況就會(huì)觸發(fā)一個(gè)拒絕執(zhí)行的操作。這是java.util.concurrent.RejectedExecutionHandler描述的任務(wù)操作。下一個(gè)小結(jié)中將描述這些任務(wù)被拒絕后的操作。
總結(jié)下這個(gè)小節(jié):
-
線程池有運(yùn)行、關(guān)閉、停止、結(jié)束四種狀態(tài),結(jié)束后就會(huì)釋放所有資源
-
平緩關(guān)閉線程池使用shutdown()
-
立即關(guān)閉線程池使用shutdownNow(),同時(shí)得到未執(zhí)行的任務(wù)列表
-
檢測(cè)線程池是否正處于關(guān)閉中,使用isShutdown()
-
檢測(cè)線程池是否已經(jīng)關(guān)閉使用isTerminated()
-
定時(shí)或者永久等待線程池關(guān)閉結(jié)束使用awaitTermination()操作
©2009-2014 IMXYLZ
|求賢若渴