執行緒池場景
面試官:「假設我們有乙個執行緒池,核心執行緒數為10,最大執行緒數也為20,任務隊列為100。現在來了100個任務,執行緒池裡現在有幾個執行緒執行?」
粉絲豪:「應該是10吧。」
面試官:「你確定?」
粉絲豪:「確定啊,就是10…」
於是乎,粉絲豪就回去等通知了~
其實這道題正確的答案是"不一定!"因為並沒指明是哪一種執行緒池機制,帶著我們的疑問繼續往下看!
正文檢視一下threadpoolexecutor的execute方法
在這裡插入描述
解釋判斷當前活躍執行緒數是否小於corepoolsize,如果小於,則呼叫addworker建立執行緒執行任務
如果不小於corepoolsize,則將任務新增到workqueue佇列
如果放入workqueue失敗,則建立執行緒執行任務,如果這時建立執行緒失敗(當前執行緒數不小於maximumpoolsize時),就會呼叫reject(內部呼叫handler)拒絕接受任務。
在這裡插入描述
如圖所示,預設的機制為執行緒池裡的核心執行緒數不夠了,後面進來的任務會先丟佇列,當佇列滿了,才起新執行緒。
但是,有一種執行緒池機制的是這樣的
先起執行緒,到最大值,再進佇列
在dubbo中,有一種執行緒池叫eagerthreadpoolexecutor執行緒池。
在這裡插入描述
它調的還是父類的execute方法,也還是threadpoolexecutor中的execute方法!
但是,它的佇列!是一種自定義佇列,叫taskqueue,它的offer方法如下
在這裡插入描述
這個offer方法的最核心的是紅框中那步,當前執行緒數小於最大執行緒數時,則直接返回false。
threadpoolexecutor中的execute方法中的第二步的條件中,如果workqueue.offer返回為fasle,則直接進入第三步,建立新任務!如下圖所示
在這裡插入描述
eagerthreadpoolexecutor執行緒池通過自定義佇列的這麼一種形式,改寫了執行緒池的機制。這種執行緒池的機制是核心執行緒數不夠了,先起執行緒,當執行緒達到最大值後,後面的任務就丟進佇列!
多工 執行緒池 攜程池
多工 執行緒池 from queue import queue from multiprocessing.dummy import pool 資料佇列 self.data queue queue self.pool pool def run more task self,func,count 1 把...
通過執行緒池處理多工
每隔1000ms去查詢一次待辦任務 timer.schedule new timertask for final invoiceonlinerequestinfodo requestinfodo invoiceonlinerequestinfodolist try catch exception e...
多工 執行
單任務 按順序執行 coding utf 8 import time def sing for i in range 5 print i am singing time.sleep 1 def dance for i in range 5 print i am danceing time.sleep...