線程池中阻塞隊列的作用?為什么是先添加列隊而不是先創建最大線程?線程池中線程復用原理


 

1、一般的隊列只能保證作為一個有限長度的緩沖區,如果超出了緩沖長度,就無法保留當前的任務了,阻塞隊列通過阻塞可以保留住當前想要繼續入隊的任務。阻塞隊列可以保證任務隊列中沒有任務時阻塞獲取任務的線程,使得線程進入wait狀態,釋放cpu資源。阻塞隊列自帶阻塞和喚醒的功能,不需要額外處理,無任務執行時,線程池利用阻塞隊列的take方法掛起,從而維持核心線程的存活、不至於一直占用cpu資源

2、在創建新線程的時候,是要獲取全局鎖的,這個時候其它的就得阻塞,影響了整體效率就好比一個飯店里面有10個(core)正式工的名額,最多招10個正式工,要是任務超過正式工人數(task>core)的情況下,工廠領導(線程池)不是首先擴招工人,還是這10人,但是任務可以稍微積壓一下,即先放到隊列去(代價低) 。10個正式工慢慢干,遲早會千完的,要是任務還在繼續增加,超過正式工的加班忍耐極限了(隊列滿了) ,就的招外包幫忙了(注意是臨時工)要是正式工加上外包還是不能完成任務,那新來的任務就會被領導拒絕了(線程池的拒絕策略)

 

線程池中線程復用原理

線程池將線程和任務進行解耦,線程是線程,任務是任務,擺脫了之前通過Thread創建線程時的一個線程必須對應一個任務的限制。在線程池中,同一個線程可以從阻塞隊列中不斷獲取新任務來執行,其核心原理在於線程池對Thread進行了封裝,並不是每次執行任務都會調用Thread.start()來創建新線程,而是讓每個線程去執行一個"循環任務",在這個"循環任務"中不停檢查是否有任務需要被執行,如果有則直接執行,也就是調用任務中的run方法,將run方法當成一個普通的方法執行,通過這種方式只使用固定的線程就將所有任務的run方法串聯起來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM