1、為什么要用線程池?
創建線程要花費昂貴的資源和時間,如果任務來了才創建線程那么響應時間會變長,而且一個進程能創建的線程數 有限。為了避免這些問題,在程序啟動的時候就創建若干線程來響應處理,它們被稱為線程池,里面的線程叫工作線程。
從JDK1.5 開始,JavaAPI 提供了 Executor 框架讓你可以創建不同的線程池。比如單線程池,每次處理一個 任務;數目固定的線程池或者是緩存線程池。
2、? 如何創建線程池?
線程池都是通過線程池工廠創建,再調用線程池中的方法獲取線程,再通過線程去執行任務方法。 Executors:線程池創建工廠類
1.? 自己根據創建線程池的需求來 new 對象(使用) 注意:線程池不允許使用 Executors 去創建,而是通過 ThreadPoolExecutor 的方式,這樣的處理方式讓寫的同學更加明確線程池的運行規則,規避資源耗盡的風險。 說明:Executors 返回的線程池對象的弊端如下: 1)FixedThreadPool 和 SingleThreadPool:允許的請求隊列長度為 Integer.MAX_VALUE,可能會堆積大量的請求,從而導致OOM。 2)CachedThreadPool 和 ScheduledThreadPool:允許的創建線程數量為 Integer.MAX_VALUE,可能會創建大量的線程,從而導致 OOM。
建議自己通過 new 關鍵字創建 newThreadPoolExecutor
3、創建線程池的方法
newFixedThreadPool():該方法返回一個固定線程數量的線程池。該線程池中的線程數量始終不變。當有一個新任務提交時,如果線程池中存在空閑的線程,則立即執行;如果沒有,則新任務會被暫時存在一個任務隊列中,待有線程空閑時再進行處理。
newSingleThreadExecutor(): 該方法返回一個只有一個線程的線程池。若多個任務被提交到該線程池,則多余的任務會被保存在一個任務隊列中,待線程空閑,按照先入先出的順序被執行。
newCachedThreadPool():根據實際情況動態調整線程數量。當新任務提交時,會優先復用空閑的線程;如果所有線程均處于工作狀態,則會創建新的線程來進行處理。
newSingleThreadScheduledExecutor():該方法返回一個 ScheduledExecutorService 對象,線程池大小為 1 。SeheduledExectorService 在繼承 ExecutorService 的基礎上還額外支持定時任務的執行。
newScheduledThreadPool():與 newSingleThreadScheduledExecutor 方法類似,但可以指定線程池中線程的數量。