執行緒池詳解

2021-10-03 03:47:31 字數 2872 閱讀 6543

1.

執行緒池的幾個重要的引數?

public

threadpoolexecutor(

intcorepoolsize,

intmaximumpoolsize,

long

keepalivetime,timeunit unit,blockingqueueworkqueue,rejectedexecutionhandler handler)

corepoolsize

:執行緒池核心執行緒數

maximumpoolsize:

執行緒池最大執行緒數

keepalivertime

:當活躍執行緒數大於核心執行緒數時,空閒的多餘執行緒最大存活時間

unit

:存活時間的單位

workqueue

:存放任務的阻塞佇列

threadfactory:執行緒工廠,主要用來建立執行緒;

handler

:超出執行緒範圍和佇列容量的任務的處理程式(表示拒絕處理任務時的策略)

當阻塞佇列滿了,且沒有空閒的工作執行緒,如果繼續提交任務,必須採取一種策略處理該任務,執行緒池提供了

4種策略:

丟棄任務並丟擲異常

也是丟棄任務,但是不丟擲異常

丟棄佇列最前面的任務,然後重新嘗試執行該任務(重複該過程)

由呼叫執行緒執行該任務

2.執行緒池的作用?

答:1.

對執行緒進行了統一的管理

,因為執行緒本身是不可預期的, 2.

執行緒池的底層並不是

new乙個執行緒,然後呼叫

start()

方法,而是有乙個名字叫

worker

的執行緒,它首先要持有

runnable

的物件的引用,然後在它的

run方法裡面直接呼叫這個物件的

run方法。

worker

執行緒不一定會因為你的

runnable

跑完而被銷毀,會接著去跑別的執行緒,實現了執行緒的復用。

3.向執行緒池提交任務有兩種是實現方式?答:1

)executor.execute(runnable command);

2) executorservice.submit(callabletask);

4.threadpoolexecutor的核心方法execute()的執行流程:答:

1)首先通過

wordcountof()

獲知當前執行緒池中的執行緒數,

如果小於核心執行緒數

corepoolsize,

就通過addworder()

建立執行緒執行該任務;

否則,將該任務放入阻塞佇列。 2)

如果能成功放入阻塞佇列中,

如果當前執行緒池是非

running

狀態,則將該任務從阻塞佇列中移除,然後執行

reject()

方法處理該任務;

如果當前執行緒池是

running

狀態,則需要再次檢查當前執行緒池,是否有空閒的執行緒,如果有則執行該任務; 3)

如果不能將該任務放入阻塞佇列,說明阻塞佇列已滿;那麼將通過

addworder()

方法嘗試建立乙個新的執行緒去執行這個任務;如果

addwork()

執行失敗,說明執行緒池中線程數達到了最大執行緒數

maxpoolsize

,則執行

reject()

方法處理任務。

5.submit()的內部實現?

答:會將提交的

callable

任務封裝成乙個

futuretask

物件,futuretask

類實現了

runnable

介面,這樣就可以通過

excutor.execute()

提交futuretask

到執行緒池中等待被執行,最終執行的是

futuretask

的run

方法。

6.executesubmit()的比較:

答:兩個方法都可以向執行緒池提交任務,

execute()

方法的返回型別是

void

,它定義在

executor

介面中,而

submit()

方法可以返回持有計算結果的

future

物件,它定義在

executorservice

介面中,擴充套件了

executor

介面。

7.執行緒池的總結:

答:執行緒池的核心執行緒數,當提交乙個任務時,執行緒池會建立乙個新的執行緒執行該任務,直到當前執行緒池中的執行緒數等於核心執行緒數

corepoolsize;

如果當前執行緒池的執行緒數為核心執行緒數,繼續提交任務則會被儲存到阻塞佇列中,等待被執行;如果阻塞佇列滿了,會建立新的執行緒執行該任務,直到執行緒池中的執行緒數達到執行緒池的最大執行緒數

maxpoo lsize,

這時如果繼續提交任務,則只能執行

reject()

方法處理該任務。

執行緒池詳解

執行緒的優點 1 執行緒的無限制建立需要占用記憶體資源 消耗時間。而使用執行緒池可以減少建立和銷毀執行緒的次數,每個工作執行緒都可以重複使用。2 可以根據系統的承受能力,調整執行緒池中工作執行緒的數量,防止因為消耗過多記憶體導致伺服器崩潰。執行緒池的構造方法 public threadpoolexe...

jdk執行緒池詳解

public threadpoolexecutor int corepoolsize,核心執行緒數 intmaximumpoolsize,最大執行緒數 long keepalivetime,空閒時間 timeunit unit,時間單位 blockingqueueworkqueue,等待佇列 thr...

Android執行緒池詳解

最近在看okhttp的原始碼,看著看著就看到了有執行緒池的地方,以前自己對這個東西就也就感到雲裡霧裡的,所以 想把執行緒池的知識點和原始碼完整的看一篇 1.執行緒池有什麼用?a.重用執行緒池中存在的執行緒,避免因為執行緒的大量建立和銷毀所帶來的效能開銷 完成一項任務的時間t 建立線 2.thread...