蘑菇街面試,設計乙個執行緒池入隊非阻塞佇列:當佇列中滿了時候,放入資料,資料丟失
阻塞佇列:當佇列滿了的時候,進行等待,什麼時候佇列中有出隊的資料,那麼第11個再放進去
出隊非阻塞佇列:如果現在佇列中沒有元素,取元素,得到的是null
阻塞佇列:等待,什麼時候放進去,再取出來
執行緒池使用的是阻塞佇列
執行緒是稀缺資源,如果被無限制的建立,不僅會消耗系統資源,還會降低系統的穩定性,合理的使用執行緒池對執行緒進行統一分配、調優和監控,有以下好處:
降低資源消耗;
提高響應速度;
提高執行緒的可管理性。
j**a1.5 中引入的 executor 框架把任務的提交和執行進行解耦,只需要定義好任務,然後提交給執行緒池,而不用關心該任務是如何執行、被哪個執行緒執行,以及什麼時候執行。
執行緒池中的核心執行緒數,當提交乙個任務時,執行緒池建立乙個新執行緒執行任務,直到當前執行緒數等於corepoolsize;如果當前執行緒數為 corepoolsize,繼續提交的任務被儲存到阻塞佇列中,等待被執行;如果阻塞佇列滿了,那就建立新的執行緒執行當前任務;直到執行緒池中的執行緒數達到 maxpoolsize,這時再有任務來,只能執行 reject() 處理該任務。
初始化方法
//execute與submit的區別使用executors靜態方法進行初始化
executorservice service =executors.newsinglethreadexecutor();
//常用方法
service.execute(new
thread());
service.submit(
newthread());
service.shutdown();
service.shutdownnow();
接收的引數不一樣
submit有返回值,而execute沒有
用到返回值的例子,比如說我有很多個做 validation 的 task,我希望所有的 task 執行完,然後每個 task 告訴我它的執行結果,是成功還是失敗,如果是失敗,原因是什麼。然後我就可以把所有失敗的原因綜合起來發給呼叫者。
submit方便exception處理
如果你在你的 task 裡會丟擲 checked 或者 unchecked exception,而你又希望外面的呼叫者能夠感知這些 exception 並做出及時的處理,那麼就需要用到 submit,通過捕獲 future.get 丟擲的異常。
shutdown與shutdownnow的區別
當執行緒池呼叫該方法時,執行緒池的狀態則立刻變成 shutdown 狀態。此時,則不能再往執行緒池中新增任何任務,否則將會丟擲 rejectedexecutionexception 異常。但是,此時執行緒池不會立刻退出,直到新增到執行緒池中的任務都已經處理完成,才會退出。
publicview codethreadpoolexecutor(
int corepoolsize, //
核心執行緒數
int maximumpoolsize, //
最大執行緒數
long keepalivetime, //
執行緒存活時間(在 corepore
存活時間的時間單位
blockingqueueworkqueue //
阻塞佇列(用來儲存等待被執行的任務)
threadfactory threadfactory, //
執行緒工廠,主要用來建立執行緒;
rejectedexecutionhandler handler //
當拒絕處理任務時的策略
)
關於 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.避免為大量請求建立執行緒,...