java中的 線程池

  java中的線程池是運用場景最多的併發框架,幾乎全部須要異步或併發執行任務的程序均可以使用線程池。在開發過程當中,合理的使用線程池能帶來3個好處。java

  一、下降資源消耗。經過重複利用已建立的線程下降線程建立和銷燬形成的消耗。併發

  二、提升響應速度。當任務到達時,任務不須要等到線程建立就能當即執行。框架

  三、提升線程的可管理性。線程是稀缺資源,若是無線的建立,不只會消耗系統資源,還會下降系統的穩定性,使用線程池能夠進行統一分配、調優和監控。可是,要作到合理利用線程池,必須對其實現原理了如指掌、異步

9.1線程池的實現原理ide

  當向線程池提交一個任務以後,線程池是如何處理這個任務的呢?來看一下線程池的主要處理流程。源碼分析

當提交一個新任務到線程池時,線程池的處理流程以下:spa

 1)、線程池判斷核心線程池裏的線程是否都在執行任務。若是不是,則建立一個新的工做線程來執行任務。若是核心線程池裏的線程都在執行任務,則進入下個流程。
線程

 2)、線程池判斷工做隊列是否已經滿。若是工做隊列沒有滿,則將新提交的任務存儲在這個工做隊列裏。若是工做隊列滿了,則進入下個流程。設計

 3)、線程池判斷線程池的線程是否都處於工做狀態。若是沒有,則建立一個新的工做線程來執行任務。若是已經滿了,則交給飽和策略來處理這個任務。orm

 ThreadPoolExecutor執行execute()方法分下面4中狀況:

 1)、若是當前運行的線程少於corePoolSize,則建立新線程來執行任務(注意,執行這一步驟須要獲取全局鎖)

 2)、若是運行的線程等於或多於corePoolSize,則將任務加入workQueue

 3)、若是沒法加入workQueue(隊列已滿)則建立新的線程來處理任務(注意,執行這一步驟須要獲取全局鎖)

 4)、若是建立的新線程將使當前運行的線程超出maximumPoolSize,任務將被拒絕,並調用RejectedExecutionHandler的rejectedExecution方法

 ThreadPoolExecutor用上述步驟的整體設計思路,是爲了在執行execute()方法時,儘量的避免獲取全局鎖(那將是一個嚴重的可伸縮瓶頸),在ThreadPoolExecutor預熱以後(當前運行的線程數大於等於corePoolSize),幾乎全部的execute()方法調用都是執行步驟2,而步驟2是不須要獲取全局鎖。


源碼分析:

工做線程:線程池建立線程時,會將線程封裝成工做線程Work,Work在執行完任務後,還會循環獲取工做隊列裏的任務來執行,咱們能夠衝Work類的run()方法裏看到這點。

線程池中的線程執行任務分爲兩種狀況,

一、在execute()方法中建立一個線程時,會將這個線程執行當前任務

二、這個線程執行任務後,會反覆從workQueue獲取任務來執行

相關文章
相關標籤/搜索