Java併發-線程池

線程池的好處

1.降低資源消耗。通過重複利用已創建的線程降低線程創建和銷燬造成的消耗。
2.提高相應速度。當任務到達時,任務可以不需要等到線程創建就能立即執行。
3.提高線程的可管理性。線程是稀缺資源,如果無限制地創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一分配,調優和監控。

線程池的處理流程

1)線程池判斷核心線程池裏的線程是否都在執行任務。如果不是,則創建一個新的工作線程來執行任務。如果核心線程池裏的線程都在執行任務,則進入下個流程。
2)線程池判斷工作隊列是否已經滿了。如果工作隊列沒有滿,則將新提交的任務存儲在這個工作隊列裏。如果工作隊列滿了,則進入下個流程。
3)線程池判斷線程池的線程是否都處於工作狀態。如果沒有,則創建一個新的工作線程來執行任務。如果已經滿了,則交給飽和策略來處理這個任務。
這裏寫圖片描述
這裏寫圖片描述

線程池參數

1)corePoolSize:當提交一個任務到線程池時,線程池會創建一個線程執行任務,即使其他空閒的基本線程能夠執行新任務也會創建線程,等到需要執行的任務大於線程池核心線程大小時就不在創建。如果調用了線程池的prestartAllCoreThreads()方法,線程池會提前創建並啓動所有基本線程。
2)runnableTaskQueue:用於保存等待執行的任務的阻塞隊列。
ArrayBlockingQueue:基於數組結構的有界阻塞隊列(FIFO)
LinkedBlockingQueue:一個基於鏈表結構的阻塞隊列。吞吐量高於ArrayBlockingQueue,靜態Executors.newFixedThreadPool()使用了這個隊列
SynchronousQueue:一個不存儲元素的阻塞隊列。沒插入操作必須等到另一個線程調用移除操作,否則插入操作一直處於阻塞狀態,吞吐量通常要高於LinkedBlockingQueue,靜態Executors.newCachedThreadPool使用了這個隊列
PriorityBlockingQueue:一個具有優先級的無限阻塞隊列
3)線程池允許創建的最大線程數。如果隊列滿了,並且已創建的線程數小於最大線程數,則線程池會再闖將新的線程執行任務。
4)ThreadFactory:用於設置創建線程的工廠給每個創建出來的線程設置更有意義的名字。可以使用guava提供的ThreadFactorybuilder快速給線程池裏的線程設置有意義的名字
new ThreadFactoryBuilder().setNameFormat(“XX”).build();
5)RejectedExecutionHandler:當隊列和線程都滿了,說明線程池處於飽和狀態,那麼必須採取一種策略處理提交的新任務。這個策略默認情況下是AbortPolicy,表示無法處理新任務時拋出異常。
Abortpolicy:直接拋出異常。
CallerRunsPolicy:只用調用者所在線程來運行任務。當最大線程數和隊列都滿時,中斷主線程並立即執行任務。
DiscardOldestPolicy:丟棄隊列裏最近的一個任務,並執行當前任務。
DiscardPolicy:不處理,丟棄掉。
6)keepAliveTime:線程池的工作線程空閒後,保持存活的時間。所以,如果任務很多,並且每個任務執行的時間比較短,可以調大時間,提高線程的利用率。

向線程池提交任務

execute()用於提交不需要返回值的任務。
submit()用於提交需要返回值的任務。

關閉線程池

調用shutdown或shutdownnow方法來關閉線程池。
原理是:遍歷線程池中的工作線程,然後諸葛調用線程的interrupt方法來中斷線程。所以補發響應中斷的任務可能永遠無法終止。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章