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.execute和submit()的比較:
答:兩個方法都可以向執行緒池提交任務,
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...