什麼是執行緒池

2022-07-07 10:42:09 字數 2688 閱讀 3495

假設有一段**,你希望非同步執行它,是不是要寫出這樣的**?

new thread(r).start();
這種寫法當然可以完成功能,可是你這樣寫,老王這樣寫,老張也這樣寫,程式中到處都是這樣建立執行緒的方法,需要寫乙個統一的工具類讓大家呼叫

1

//新執行緒:直接建立乙個新執行緒執行

2class flashexecutor implements

executor

6 }

假如有 10000 個人都呼叫這個工具類提交任務,那就會建立 10000 個執行緒來執行,這肯定不合適!要控制一下執行緒的數量。

這個設計有了三個重大的意義:

1. 控制了執行緒數量。

2. 佇列不但起到了緩衝的作用,還將任務的提交與執行解耦了。

3. 最重要的一點是,解決了每次重複建立和銷毀執行緒帶來的系統開銷。

吧。

1. 初始化執行緒池時,直接啟動 corepoolsize 個工作執行緒 worker 先跑著。

2. 這些 worker 就是死迴圈從佇列裡取任務然後執行。

3. execute 方法仍然是直接把任務放到佇列,但佇列滿了之後直接拋棄。

現在我們已經實現了乙個至少不那麼醜陋的執行緒池了,但還有幾處小瑕疵,

比如初始化的時候,就建立了一堆 worker 執行緒在那空跑著,假如此時並沒有非同步任務提交過來執行,這就有點浪費了。

現在我們做出如下改進:

就像下面這樣:

彈性就是在任務提交比較頻繁,和任務提交非常不頻繁這兩種情況下,這個**是有問題的。

當提交任務的量突增時,工作執行緒和佇列都被佔滿了,就只能走拒絕策略,其實就是被丟棄掉。

呼叫方可以通過設定很大的核心執行緒數 corepoolsize 來解決這個問題呀。

的確是可以,但一般場景下 qps 高峰期都很短,而為了這個很短暫的高峰,設定很大的核心執行緒數,簡直太浪費資源了。

具體操作演示:

文字說明:

1. 開始的時候和上一版一樣,當 workcount < corepoolsize 時,通過建立新的 worker 來執行任務。

2. 當 workcount >= corepoolsize 就停止建立新執行緒,把任務直接丟到佇列裡。

3. 但當佇列已滿且仍然 workcount < maximumpoolsize 時,不再直接走拒絕策略,而是建立非核心執行緒,直到 workcount = maximumpoolsize,再走拒絕策略。

corepoolsize 就負責平時大多數情況所需要的工作執行緒數,而 maximumpoolsize 就負責在高峰期臨時擴充工作執行緒數。

高峰時期的彈性搞定了,那自然就還要考慮低谷時期。當長時間沒有任務提交時,核心執行緒與非核心執行緒都一直空跑著,浪費資源。

我們可以給非核心執行緒設定乙個超時時間

總結

首先它的構造方法是這個樣子:

1

public

flashexecutor(

2int

corepoolsize,

3int

maximumpoolsize,

4long

keepalivetime,

5timeunit unit,

6 blockingqueueworkqueue,

7threadfactory threadfactory,

8rejectedexecutionhandler handler)

9

這些引數分別是

int corepoolsize:核心執行緒數

int maximumpoolsize:最大執行緒數

long keepalivetime:非核心執行緒的空閒時間

timeunit unit:空閒時間的單位

blockingqueueworkqueue:任務佇列(執行緒安全的阻塞佇列)

threadfactory threadfactory:執行緒工廠

rejectedexecutionhandler handler:拒絕策略

整個任務的提交流程是:

來自:

什麼是執行緒池?執行緒池的工作原理和使用執行緒池的好處

乙個執行緒池管理了一組工作執行緒,同時它還包括了乙個用於放置等待執行任務的任務佇列 阻塞佇列 預設情況下,在建立了執行緒池後,執行緒池中的執行緒數為0.當任務提交給執行緒池之後的處理策略如下 1 如果此時執行緒池中的數量小於corepoolsize 核心池的大小 即使執行緒池中的執行緒都處於空閒狀態...

什麼是執行緒池?執行緒池的工作原理和使用執行緒池的好處

乙個執行緒池管理了一組工作執行緒,同時它還包括了乙個用於放置等待執行任務的任務佇列 阻塞佇列 預設情況下,在建立了執行緒池後,執行緒池中的執行緒數為0.當任務提交給執行緒池之後的處理策略如下 1 如果此時執行緒池中的數量小於corepoolsize 核心池的大小 即使執行緒池中的執行緒都處於空閒狀態...

什麼是執行緒池 帶你初步入門理解執行緒池

答 其實說白了,執行緒池是一種多執行緒處理方法,幫我們管理執行緒,避免建立大量的執行緒增加伺服器壓力。其實在物件導向程式設計中,物件建立和銷毀是很費時間的 那麼大家就會說,使用執行緒技術不就好了 ps 多執行緒技術主要解決處理器單 元內多個執行緒執行的問題,它可以顯著減少處理器單元的閒置時間,增加處...