執行緒池多工的執行順序

2021-10-12 10:35:31 字數 1062 閱讀 9632

執行緒池場景

面試官:「假設我們有乙個執行緒池,核心執行緒數為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...