<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    xylz,imxylz

    關注后端架構、中間件、分布式和并發編程

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      111 隨筆 :: 10 文章 :: 2680 評論 :: 0 Trackbacks

     

    我們知道線程是有多種執行狀態的,同樣管理線程的線程池也有多種狀態。JVM會在所有線程(非后臺daemon線程)全部終止后才退出,為了節省資源和有效釋放資源關閉一個線程池就顯得很重要。有時候無法正確的關閉線程池,將會阻止JVM的結束。

    線程池Executor是異步的執行任務,因此任何時刻不能夠直接獲取提交的任務的狀態。這些任務有可能已經完成,也有可能正在執行或者還在排隊等待執行。因此關閉線程池可能出現一下幾種情況:

    • 平緩關閉:已經啟動的任務全部執行完畢,同時不再接受新的任務
    • 立即關閉:取消所有正在執行和未執行的任務

    另外關閉線程池后對于任務的狀態應該有相應的反饋信息。

    圖1 描述了線程池的4種狀態。

    • 線程池在構造前(new操作)是初始狀態,一旦構造完成線程池就進入了執行狀態RUNNING。嚴格意義上講線程池構造完成后并沒有線程被立即啟動,只有進行“預啟動”或者接收到任務的時候才會啟動線程。這個會后面線程池的原理會詳細分析。但是線程池是出于運行狀態,隨時準備接受任務來執行。
    • 線程池運行中可以通過shutdown()和shutdownNow()來改變運行狀態。shutdown()是一個平緩的關閉過程,線程池停止接受新的任務,同時等待已經提交的任務執行完畢,包括那些進入隊列還沒有開始的任務,這時候線程池處于SHUTDOWN狀態;shutdownNow()是一個立即關閉過程,線程池停止接受新的任務,同時線程池取消所有執行的任務和已經進入隊列但是還沒有執行的任務,這時候線程池處于STOP狀態。
    • 一旦shutdown()或者shutdownNow()執行完畢,線程池就進入TERMINATED狀態,此時線程池就結束了。
    • isTerminating()描述的是SHUTDOWN和STOP兩種狀態。
    • isShutdown()描述的是非RUNNING狀態,也就是SHUTDOWN/STOP/TERMINATED三種狀態。

     

    Executor-Lifecycle

    圖1

    線程池的API如下:

    ExecutorService-LifeCycle

    圖2

    其中shutdownNow()會返回那些已經進入了隊列但是還沒有執行的任務列表。awaitTermination描述的是等待線程池關閉的時間,如果等待時間線程池還沒有關閉將會拋出一個超時異常。

    對于關閉線程池期間發生的任務提交情況就會觸發一個拒絕執行的操作。這是java.util.concurrent.RejectedExecutionHandler描述的任務操作。下一個小結中將描述這些任務被拒絕后的操作。

     

    總結下這個小節:

    1. 線程池有運行、關閉、停止、結束四種狀態,結束后就會釋放所有資源
    2. 平緩關閉線程池使用shutdown()
    3. 立即關閉線程池使用shutdownNow(),同時得到未執行的任務列表
    4. 檢測線程池是否正處于關閉中,使用isShutdown()
    5. 檢測線程池是否已經關閉使用isTerminated()
    6. 定時或者永久等待線程池關閉結束使用awaitTermination()操作

     



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

    評論

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

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

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

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

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

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

    我submit一個runnable接口任務,最后怎樣來確認這些在線程池中的任務都完成了呢?  回復  更多評論
      


    ©2009-2014 IMXYLZ
    主站蜘蛛池模板: 亚洲视频在线观看2018| 亚洲日产韩国一二三四区| 亚洲精品中文字幕麻豆| 久久久久成人精品免费播放动漫| 亚洲情综合五月天| 色欲A∨无码蜜臀AV免费播 | 亚洲AV无码专区在线电影成人| 三年片在线观看免费大全| 亚洲真人无码永久在线观看| 亚洲欧洲日韩国产| 日本一区二区三区在线视频观看免费| 情侣视频精品免费的国产| 日产久久强奸免费的看| 亚洲一区二区三区香蕉| 无码午夜成人1000部免费视频| 一区二区三区亚洲| 在线不卡免费视频| 免费人成大片在线观看播放| 亚洲色精品aⅴ一区区三区| 日韩中文字幕免费视频| 亚洲AV色吊丝无码| 日韩精品成人亚洲专区| a毛片免费全部在线播放**| 久久99国产亚洲精品观看| 国产四虎免费精品视频| 精品国产亚洲AV麻豆| 亚洲色偷偷综合亚洲AV伊人| 鲁丝片一区二区三区免费| 亚洲国产成人精品电影| 免费少妇a级毛片人成网| 美女在线视频观看影院免费天天看| 亚洲成a人片毛片在线| 免费一级毛片在线播放| 在线观看免费播放av片| 亚洲日本VA午夜在线电影| 国产成人综合亚洲亚洲国产第一页| 最近2019免费中文字幕6| 亚洲精品无播放器在线播放| 亚洲日产无码中文字幕| 成年女人免费视频播放77777| 一级中文字幕乱码免费|