執行緒池實現原理

2022-09-12 07:33:14 字數 2365 閱讀 6034

蘑菇街面試,設計乙個執行緒池

入隊非阻塞佇列:當佇列中滿了時候,放入資料,資料丟失

阻塞佇列:當佇列滿了的時候,進行等待,什麼時候佇列中有出隊的資料,那麼第11個再放進去

出隊非阻塞佇列:如果現在佇列中沒有元素,取元素,得到的是null

阻塞佇列:等待,什麼時候放進去,再取出來

執行緒池使用的是阻塞佇列

執行緒是稀缺資源,如果被無限制的建立,不僅會消耗系統資源,還會降低系統的穩定性,合理的使用執行緒池對執行緒進行統一分配、調優和監控,有以下好處:

降低資源消耗;

提高響應速度;

提高執行緒的可管理性。

j**a1.5 中引入的 executor 框架把任務的提交和執行進行解耦,只需要定義好任務,然後提交給執行緒池,而不用關心該任務是如何執行、被哪個執行緒執行,以及什麼時候執行。

執行緒池中的核心執行緒數,當提交乙個任務時,執行緒池建立乙個新執行緒執行任務,直到當前執行緒數等於corepoolsize;如果當前執行緒數為 corepoolsize,繼續提交的任務被儲存到阻塞佇列中,等待被執行;如果阻塞佇列滿了,那就建立新的執行緒執行當前任務;直到執行緒池中的執行緒數達到 maxpoolsize,這時再有任務來,只能執行 reject() 處理該任務。

初始化方法

//

使用executors靜態方法進行初始化

executorservice service =executors.newsinglethreadexecutor();

//常用方法

service.execute(new

thread());

service.submit(

newthread());

service.shutdown();

service.shutdownnow();

execute與submit的區別

接收的引數不一樣

submit有返回值,而execute沒有

用到返回值的例子,比如說我有很多個做 validation 的 task,我希望所有的 task 執行完,然後每個 task 告訴我它的執行結果,是成功還是失敗,如果是失敗,原因是什麼。然後我就可以把所有失敗的原因綜合起來發給呼叫者。

submit方便exception處理

如果你在你的 task 裡會丟擲 checked 或者 unchecked exception,而你又希望外面的呼叫者能夠感知這些 exception 並做出及時的處理,那麼就需要用到 submit,通過捕獲 future.get 丟擲的異常。

shutdown與shutdownnow的區別

當執行緒池呼叫該方法時,執行緒池的狀態則立刻變成 shutdown 狀態。此時,則不能再往執行緒池中新增任何任務,否則將會丟擲 rejectedexecutionexception 異常。但是,此時執行緒池不會立刻退出,直到新增到執行緒池中的任務都已經處理完成,才會退出。

public

threadpoolexecutor(

int corepoolsize, //

核心執行緒數

int maximumpoolsize, //

最大執行緒數

long keepalivetime, //

執行緒存活時間(在 corepore

存活時間的時間單位

blockingqueueworkqueue //

阻塞佇列(用來儲存等待被執行的任務)

threadfactory threadfactory, //

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

rejectedexecutionhandler handler //

當拒絕處理任務時的策略

)

view code

關於 workqueue 引數,有四種佇列可供選擇:

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

當然也可以根據應用場景實現 rejectedexecutionhandler 介面,自定義飽和策略,如記錄日誌或持久化儲存不能處理的任務。

private final atomicinteger ctl = new atomicinteger(ctlof(running, 0));

其中 atomicinteger 變數 ctl 的功能非常強大:利用低 29 位表示執行緒池中線程數,通過高 3 位表示執行緒池的執行狀態:

如果執行了執行緒池的 prestartallcorethreads() 方法,執行緒池會提前建立並啟動所有核心執行緒。 threadpoolexecutor 提供了動態調整執行緒池容量大小的方法:setcorepoolsize() 和 setmaximumpoolsize()。

執行緒池實現原理

上面這幅圖作者表達的不夠完整,作者想通過如下文本來表達內含本質。過程如下 如果請求執行緒小於執行緒池目標執行緒,則執行緒池會新建立執行緒來處理請求 如果請求執行緒數過多,超過了目標執行緒則將請求任務放入佇列中進行緩衝 如果佇列滿了 但未達到最大執行緒池數,這時會新建立執行緒 直到上限為止即maxpo...

Java執行緒池實現原理

threadpoolexecutor是jdk提供的執行緒池實現,threadpoolexector實現了execturo介面,可以自動幫助使用者建立,銷毀和保護執行緒,先來看一下最基本的使用方式 建立乙個執行緒池final executor executor new threadpoolexecut...

執行緒池原理 具體實現

一種執行緒使用模式。執行緒過多會帶來排程開銷,進而影響快取區域性性和整體效能。而執行緒池維護著多個執行緒,等待著監督管理者分配可併發執行的任務,即在程式初始化時,建立一定數量的執行緒 又最大限制 從任務佇列中獲取任務,進行處理 執行緒池 至少乙個執行緒 任務佇列 作用 1.避免為大量請求建立執行緒,...