Java 線程池的原理知道嗎?
線程池的好處
- 降低資源消耗。重複利用已建立的線程降低線程建立和銷毀造成的消耗。
- 提高響應速度。當任務到達時,任務可以不需要等到線程建立就能立即執行。
- 提高線程的可管理性。線程是稀缺資源,如果頻繁建立,會消耗系統資源,降低系統穩定性,使用線程池統一配置設定、調優和監控。
線程池有核心參數:
- maximumPoolSize:最大線程數。線程池允許建立的最大線程數。
- corePoolSize:核心線程數。當送出一個任務到線程池時,線程池會建立一個線程來執行任務,即使其他空閑的核心線程能夠執行新任務也會建立線程,等到 需要執行的任務數大于線程池基本大小時就不再建立。如果調用了線程池的 prestartAllCoreThreads() 方法,則線程池會提前建立并啟動所有基本線程。
- keepAliveTime:線程活動保持時間 ,線程池的工作線程空閑後,保持存活的時間。
線程池執行流程?
- 當我們送出任務,線程池會根據 corePoolSize 大小建立若幹任務數量線程執行任務
- 當任務的數量超過 corePoolSize 數量,後續的任務将會進入阻塞隊列阻塞排隊。
- 當阻塞隊列也滿了之後,那麼将會繼續建立(maximumPoolSize-corePoolSize)個數量的線程來執行任務,如果任務處理完成,maximumPoolSize-corePoolSize 額外建立的線程等待 keepAliveTime 之後被自動銷毀
- 如果達到 maximumPoolSize,阻塞隊列還是滿的狀态,那麼将根據不同的拒絕政策對應處理。