介紹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>