重點内容 線程池的使⽤ 建立線程池 送出任務 關閉線程池 線程池的原理 合理配置線程池 線程池的監控
corePoolSize:線程池的基本大小。 提前調用prestartAllCoreThreads(),會把所有的基本線程啟動 。 workQueue: ⽤于儲存等待執⾏的任務的阻塞隊列。 ArrayBlockingQueue 基于數組實作的(先進先出)。 LinkedBlockingQueue 吞吐量要高于ArrayBlockingQueue。 SynchronousQueue 吞吐量要高于LinkedBlockingQueue 不存儲元素的阻塞隊列,得等一個線程做移除操作才能繼續進行,要不會一直阻塞。 PriorityBlockingQueue 具有優先級的無限阻塞隊列。 maximumPoolSize: 線程池允許建立的最⼤線程數。 threadFactory: ⽤于設定建立線程的工廠可以使用谷歌的開源方法。 handler: 飽和政策,阻塞隊列和我們的線程的建立數都滿了的時候就會飽和選擇一個政策對新送出的政策進行處理。 AbortPolicy 直接抛出異常。 CallerRunsPolicy 隻用調用者所在的線程來處理任務。 DiscardOldestPolicy 丢棄隊列裡最近的一個任務。 DiscardPolicy 直接丢棄。 ⾃定義 自己定義一個處理方式。 keepAliveTime:線程池的⼯作線程空閑後,保持存活的時間。 unit:線程活動保持時間的機關。
execute:⽤于送出不需要傳回值的任務 submit:⽤于送出需要傳回值的任務 shutdown:終止的時候會抛出異常 shutdownNow:中止的時候不會抛出異常
線程池測試代碼

首先會判斷corePoolSize核心線程池是否已經滿了,沒滿就直接建立線程執行任務,滿了再去判斷隊列是否滿了,隊列沒有滿的話在把任務放在隊列裡面,隊列如果滿的話,會将目前的線程數量跟maximumPoolSize進行對比如果沒滿的話就建立線程執行任務,maximumPoolSize也滿了話就按照政策(handler)處理無法執行的任務。注意線程池隻要建立線程就會擷取全局鎖。
線程會根據worker去線程池裡面拿任務
線程池execute的源碼
線程池addWorker的源碼
線程池runWorker的源碼
任務的性質 CPU密集型 : N cpu + 1 配置盡可能小的線程,線程數要少一點,減少cpu頻繁的上下文切換,提高cpu的使用率 IO 密集型 :2 * N cpu 需要配置盡可能多的線程,這樣才能保證cpu能被充分的利用 混合型 :拆分成CPU密集型和IO密集型 N = Runtime.getRuntime().availableProcessors() 任務的優先級 :PriorityBlockingQueue 任務的執⾏時間 不同規模的線程池 PriorityBlockingQueue 讓執行時間比較短的線程先執行 任務的依賴性 增加線程數量 使⽤有界隊列保證系統的穩定性
taskCount 任務的數量 completedTaskCount 運作的過程中完成的任務數量 largestPoolSize 曾經建立過的最大的線程數量 getPoolSize 線程數量 getActiveCount 擷取活動的線程數 擴充線程池:beforeExecute、afterExecute 線上程執行前,執行後做點什麼