jdk執行緒池學習筆記

2021-10-19 14:57:46 字數 1272 閱讀 2378

1.執行緒池的執行緒儲存在hashset中,處理流程:core pool->blocking queue->max pool->reject policy;

2.核心執行緒池一般不會**,除非設定了allowcorethreadtimeout,執行緒空閒時處於駐留狀態(locksupport.park);

3.keepalivetime對於超過核心執行緒數部分的執行緒有效,這部分「多餘的執行緒」超過空閒時間會**。

runnable無返回值,callable包含返回值

submit 包含返回值,可以通過future.get獲取返回值或者獲取執行緒異常;

execute無返回值,也無法獲取異常

1.主要屬性:任務狀態state,執行結果outcome,執行任務callable(任務單元是乙個callable物件,即使通過runnable物件傳入也為通過介面卡封裝成乙個callable);

2.get方法詳解:

**已經很精煉了,簡單做下分析:state為volatile變數,當任務未完成是進入awaitdone方法等待(阻塞呼叫執行緒,非任務執行執行緒),裡面是一系列cas操作和locksupport.park,在此不做展開了。report方法有必要重點講下:

可以看到report方法返回正常結果或丟擲執行異常,這裡有個問題,outcome不是volatile變數,那執行結果的可見性如何保證?這就要看set方法的處理方式了。

3.set方法詳解:

首先set方法是在run方法中呼叫,也就是執行緒執行完畢的時候設定執行結果。

可以看到outcome=v之後緊跟著unsafe.putorderedint操作,這行**的作用有兩個:1.state狀態設定為正常執行完成;2.在設定state之前插入乙個store-store屏障,保證outcome的寫入在state寫入之前完成。再結合之前的get方法,outcome的讀取在state的讀取之後(這是由volatile語義保證了,實際是volatile變數讀之後的load-load屏障保證執行順序),因此可以保證獲取到最新outcome值。

最後finishcompletion方法通過locksupport.unpark喚醒被get方法阻塞的執行緒。

JDK 執行緒池

在jdk的4種執行緒池之前,先介紹一下執行緒池的幾個引數 固定執行緒池數量,核心執行緒數 最大執行緒數 任務佇列 linkedblockingqueue integer.max value 無界佇列 適用於同時處理固定任務數的場景.public static executorservice newf...

jdk執行緒池詳解

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

jdk執行緒池 Executor體系

提供了乙個執行緒佇列,佇列中儲存著所有等待狀態的執行緒。避免了建立與銷毀額外開銷,提高了響應的速度。executor 負責執行緒的使用與排程的根介面 只有乙個execute runnable 方法 executorservice 子介面 executorservice 繼承 executor,並宣告...