<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
    主站蜘蛛池模板: 亚洲av无码国产综合专区| 毛茸茸bbw亚洲人| 亚洲视频在线免费播放| 久视频精品免费观看99| 色拍自拍亚洲综合图区| 亚洲久悠悠色悠在线播放| 国产亚洲综合久久| 成人片黄网站色大片免费观看APP| 免费国产成人α片| 天天干在线免费视频| 亚洲免费在线视频| 国产偷国产偷亚洲清高APP| 日韩免费高清大片在线| 午夜dj在线观看免费视频| 亚洲日韩国产精品第一页一区| 亚洲熟妇av一区| 久久嫩草影院免费看夜色| 在线观看AV片永久免费| 亚洲午夜久久久久久久久电影网| 中文字字幕在线高清免费电影| 最近2019中文字幕免费看最新| 亚洲处破女AV日韩精品| 福利片免费一区二区三区| 亚洲第一页日韩专区| 亚洲另类图片另类电影| 花蝴蝶免费视频在线观看高清版| 久久久久亚洲精品无码系列| 无码天堂亚洲国产AV| 亚洲人成人网站在线观看| 亚洲av永久无码精品网址| 99久久精品免费视频| 亚洲综合精品成人| 91精品免费在线观看| 久久精品国产亚洲精品2020| 97无码免费人妻超级碰碰碰碰| 亚洲精品福利网站| 国产成人aaa在线视频免费观看| 亚洲福利一区二区| 免费国产小视频在线观看| 亚洲av综合av一区二区三区| 日本一区二区三区免费高清|