java併發編程實戰------線程池的使用

1、在任務和執行策略之間的隱性耦合,有些任務須要明確指定執行策略數據庫

一、依賴性任務:提交到線程池的任務依賴其餘的任務;安全

二、使用線程封閉機制的任務:單線程任務變爲併發時失去線程安全性;網絡

三、對響應時間敏感的任務:一個任務長時間執行或者多個長時間任務在數量少的線程池中,下降了線程池 對任務的響應性;併發

綜上,只有同類型且互相獨立的任務才能使線程池達到最佳性能。函數

1.1 Thread Starvation Deadlock線程飢餓死鎖:線程池中的任務須要無限期等待一些必須由池中其餘任 務才能提供的資源或條件,在線程池不是無限大時會發生線程飢餓死鎖。(跑了兩個互相依賴的任務提交到單線程線程池時飢餓死鎖問題,運行試過了這狀況其實嚴格說不是死鎖,而是其中一個任務在無限期等待另外一個任務,而另外一個任務不會執行)性能

1.2 運行時間較長的任務:線程數過少,運行時間較長,會致使線程池中任務阻塞;線程

2、線程池的大小:通常不會固定,應該基於某種機制來配置,或者根據Runtime.getRuntime().availableProcessors()來配置。隊列

計算密集型任務:計算機大部分CPU消耗在計算、循環、邏輯判斷上面,叫作計算密集型任務; IO密集型任務:頻繁的網絡IO、硬盤文件IO、其餘設備IO,叫作IO密集型任務;內存

計算密集型任務在cpu個數+1時一般能夠獲得最好的CPU利用率; IO密集型任務的線程數最優是:NU(1 + W/C),N是CPU個數,U是CPU利用率,W/C是cpu等待時間與計算時間對比。也有其餘狀況:線程池和資源池相互制約的狀況,好比線程池和數據庫鏈接池的狀況,若是每一個任務都須要數據庫鏈接,那麼鏈接池的鏈接數就限制了線程池的大小;資源

3、配置ThreadPoolExecutor 一、線程的建立和銷燬,取決於線程池的參數:基本大小、最大大小、存活時間; 二、管理隊列任務:比較穩妥的資源管理策略是使用有界工做隊列,且有界工做隊列的大小與線程池大小須要一塊兒調節,好比:大隊列和小線程池雖然能夠下降內存使用量,下降CPU使用率,減小上下文切換,可是會限制吞吐量;對於很大的線程池或者無界線程池則應該使用Synchronous同步移交來做爲任務隊列; 三、飽和策略RejectExecutionHandler:AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy 四、線程工廠:一、爲線程指定名稱;二、指定定製的UncaughtExceptionHandler、 五、執行構造函數後還能夠定製ThreadPoolExecutor。

4、擴展ThreadPoolExecutor,可經過實現beforeExecute afterExecute terminated 三個方法來擴展一些定製功能,好比執行時間 任務總數 總的執行時間等。

相關文章
相關標籤/搜索