线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?线程池中线程复用原理
1、一般的隊列只能保證作為一個有限長度的緩沖區,如果超出了緩沖長度,就無法保留當前的任務了,阻塞隊列通過阻塞可以保留住當前想要繼續入隊的任務。阻塞隊列可以保證任務隊列中沒有任務時阻塞獲取任務的線程,使得線程進入wait狀態,釋放cpu資源。阻塞隊列自帶阻塞和喚醒的功能,不需要額外處理,無任務執行時,線程池利用阻塞隊列的take方法掛起,從而維持核心線程的存活、不至于一直占用cpu資源
2、在創建新線程的時候,是要獲取全局鎖的,這個時候其它的就得阻塞,影響了整體效率就好比一個飯店里面有10個(core)正式工的名額,最多招10個正式工,要是任務超過正式工人數(task>core)的情況下,工廠領導(線程池)不是首先擴招工人,還是這10人,但是任務可以稍微積壓一下,即先放到隊列去(代價低) 。10個正式工慢慢干,遲早會千完的,要是任務還在繼續增加,超過正式工的加班忍耐極限了(隊列滿了) ,就的招外包幫忙了(注意是臨時工)要是正式工加上外包還是不能完成任務,那新來的任務就會被領導拒絕了(線程池的拒絕策略)
線程池中線程復用原理
線程池將線程和任務進行解耦,線程是線程,任務是任務,擺脫了之前通過Thread創建線程時的一個線程必須對應一個任務的限制。在線程池中,同一個線程可以從阻塞隊列中不斷獲取新任務來執行,其核心原理在于線程池對Thread進行了封裝,并不是每次執行任務都會調用Thread.start()來創建新線程,而是讓每個線程去執行一個"循環任務",在這個"循環任務"中不停檢查是否有任務需要被執行,如果有則直接執行,也就是調用任務中的run方法,將run方法當成一個普通的方法執行,通過這種方式只使用固定的線程就將所有任務的run方法串聯起來。
總結
以上是生活随笔為你收集整理的线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?线程池中线程复用原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线程池的处理流程和原理
- 下一篇: 理解线程池中线程的复用原理