xylz,imxylz

          關(guān)注后端架構(gòu)、中間件、分布式和并發(fā)編程

             :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            111 隨筆 :: 10 文章 :: 2680 評(píng)論 :: 0 Trackbacks

          公告

          常用鏈接

          留言簿(149)

          隨筆分類(lèi)(137)

          隨筆檔案(107)

          文章分類(lèi)(12)

          文章檔案(12)

          友情鏈接

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

           

          我們知道線程是有多種執(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)。

           

          Executor-Lifecycle

          圖1

          線程池的API如下:

          ExecutorService-LifeCycle

          圖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é):

          1. 線程池有運(yùn)行、關(guān)閉、停止、結(jié)束四種狀態(tài),結(jié)束后就會(huì)釋放所有資源
          2. 平緩關(guān)閉線程池使用shutdown()
          3. 立即關(guān)閉線程池使用shutdownNow(),同時(shí)得到未執(zhí)行的任務(wù)列表
          4. 檢測(cè)線程池是否正處于關(guān)閉中,使用isShutdown()
          5. 檢測(cè)線程池是否已經(jīng)關(guān)閉使用isTerminated()
          6. 定時(shí)或者永久等待線程池關(guān)閉結(jié)束使用awaitTermination()操作

           



          ©2009-2014 IMXYLZ |求賢若渴
          posted on 2011-01-04 22:54 imxylz 閱讀(12597) 評(píng)論(6)  編輯  收藏 所屬分類(lèi): Java Concurrency

          評(píng)論

          # re: 深入淺出 Java Concurrency (30): 線程池 part 3 Executor 生命周期 2011-01-04 23:02 yeshucheng
          lz你寫(xiě)的東西,是時(shí)候把它轉(zhuǎn)成PDF附件,這樣以后閱讀更方便。  回復(fù)  更多評(píng)論
            

          # re: 深入淺出 Java Concurrency (30): 線程池 part 3 Executor 生命周期 2011-01-04 23:04 yeshucheng
          感覺(jué)你這里還少了幾個(gè)狀態(tài)的介紹,呵呵  回復(fù)  更多評(píng)論
            

          # re: 深入淺出 Java Concurrency (30): 線程池 part 3 Executor 生命周期 2011-01-04 23:05 xylz
          @yeshucheng
          這個(gè)建議不錯(cuò),整理完成了來(lái)一個(gè)完整的PDF吧,每一節(jié)搞一個(gè)PDF閑麻煩  回復(fù)  更多評(píng)論
            

          # re: 深入淺出 Java Concurrency (30): 線程池 part 3 Executor 生命周期 2011-01-04 23:06 xylz
          @yeshucheng
          還有么?這個(gè)狀態(tài)是線程池的,不是線程的狀態(tài)。  回復(fù)  更多評(píng)論
            

          # re: 深入淺出 Java Concurrency (30): 線程池 part 3 Executor 生命周期 2012-11-14 11:14 yufeng
          有isTerminating 這個(gè)方法?
          isShutdown 和 isTerminated 的意思好像不太對(duì)哦。。  回復(fù)  更多評(píng)論
            

          # re: 深入淺出 Java Concurrency (30): 線程池 part 3 Executor 生命周期[未登錄](méi) 2014-08-25 11:46 nemo
          請(qǐng)問(wèn)ThreadPoolExecutor是否有查看線程池是否空閑,當(dāng)前有多少個(gè)線程正在工作的接口呢....

          我submit一個(gè)runnable接口任務(wù),最后怎樣來(lái)確認(rèn)這些在線程池中的任務(wù)都完成了呢?  回復(fù)  更多評(píng)論
            


          ©2009-2014 IMXYLZ
          主站蜘蛛池模板: 尼木县| 安国市| 沙湾县| 邢台县| 嵊泗县| 夏河县| 安平县| 惠来县| 连州市| 蓬安县| 米泉市| 都安| 台南县| 肥东县| 平舆县| 威海市| 鄢陵县| 岱山县| 石台县| 岫岩| 昆山市| 广西| 宁乡县| 安义县| 恭城| 西华县| 崇文区| 甘肃省| 吉水县| 岚皋县| 安图县| 广平县| 西充县| 陇南市| 抚州市| 东明县| 甘德县| 固阳县| 南昌市| 淮南市| 宝丰县|