介紹Java中的四種線程池

小小趙 8年前發布 | 13K 次閱讀 線程池 Java Java開發

來自: http://xunhou.me/java-thread-pool/

線程池作用

線程池作用就是限制系統中執行線程的數量,且復用以前工作線程。根據當前的環境,手動配置線程池,減少對系統資源的浪費和擁擠。用線程池控制線程數量,同時運行X個core線程,其他線程排隊等候。一個工作任務執行完畢之后,從隊列前面取一個再執行。若隊列中沒有等待線程,線程池資源處于等待狀態。

使用線程池的好處

線程池可根據系統的承受能力,調整線程池中工作線程的數目,防止OOM或者應用卡死。(控制線程數量,防止消耗完所有的內存)如果不使用線程池,線程將會無法統一管理,而且每次都在new 新的對象,不會復用以前new的工作線程。(減少創建銷毀線程所花的時間以及系統資源的開銷)

Java自帶的幾種線程池

  • 1.newSingleThreadExecutor 創建一個單線程化的Executor,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。最大特點是可以保證按照順序執行各個任務,不會有多個線程是可活動的。

  • 1.newScheduledThreadPool 創建一個定長線程池,可控制線程最大并發數,支持定時及周期性任務執行,類似于Timer。

  • 1.newFixedThreadPool 創建一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待。

  • 1.newCachedThreadPool 創建一個可緩存的線程池。可創建的最大線程數量沒有限制,如果長時間(60秒)沒有向線程池中提交新任務,該線程會被終止。

AsyncTask

AsyncTask也是使用線程池來控制的,是用ThreadPollExecutor,core線程數量是5,線程池最大值是128,也就是說最多5個線程同時在執行,最多128個任務在隊列中排隊等待。

Timer和ScheduledExecutorService

Timer在執行定時任務時只會創建一個線程,如果存在多個任務,任務耗時時間過長,會發生兩個任務執行間隔不準確的情況。ScheduledExecutorService內部是線程池,不會因為任務耗時過長而讓其時間的間隔不正確。兩個任務線程互相不會干擾。Timer在執行定時任務時候依賴與系統的時間,比如系統時間人為的去改變了,執行結果也會發生改變。ScheduledExecutorService是基于時間的延時,不會依賴與系統時間改變的。綜上所述使用ScheduledExecutorService代替Timer比較好。

</div>

 本文由用戶 小小趙 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!