一.目的
worker用於執行任務。
順便了解下執行緒池狀態流:
running可以通過shutdown方法到shutdown狀態,然後之後會變成tidying狀態,最後變成terminate狀態。
通過shutdownnow方法,則狀態直接變成:stop,然後變成tidying狀態,最後變成terminate狀態。
這裡需要注意shutdown,shutdownnow兩個方法的區別 。
shutdown方法,不會接收新任務,但會等待處理完任務佇列中的任務再結束執行緒池。
shutdownnow比較粗暴,不會接收新任務,如果有任務在執行會強制中斷它,然後把任務佇列中的任務返回給呼叫方,這裡就要根據業務是否允許強制中斷來分析風險點。
worker為了不消耗大量cpu,會阻塞,底層是blockingqueue的阻塞獲取機制。
二.基礎知識
worker在第一次建立時,會先執行傳入的task,之後會從任務佇列中取。
多個worker在threadpoolexecutor中儲存是乙個hashset。
worker資料結構:
final thread thread;//執行執行緒
runnable firsttask;//第乙個任務
volatile long completedtasks;//當前worker已經完成的任務數
worker繼承於aqs。
核心方法是:【runworker(worker w) 】
基本邏輯分為:
1.如果是建立時執行,有firsttask則執行這個任務。否則從任務佇列中獲取
while (task != null || (task = gettask()) != null)
gettask())用於獲取任務。後面會詳細說明。
2.檢查當前執行緒池狀態,如果是stop(shutdownnow方法觸發),並且執行緒狀態中斷標記未設定,則設定中斷位
3.執行beforeexecute方法,預設實現為空,主要是threadpoolexecutor交給子類去實現一些個性化邏輯
4.執行任務run方法,這裡業務任務發生異常,這個worker執行緒會被釋放。並且會如果當前執行緒數已經小於核心執行緒數則會再建立乙個worker
5.執行afterexecute對錯誤資訊可以進行特殊處理
方法**如下:
final void runworker(worker w) catch (runtimeexception x) catch (error x) catch (throwable x) finally
} finally
}completedabruptly = false;//這個標記用於區分是異常或者中斷,還是正常因為執行緒要**等情況。前者異常需要在執行後面processworkerexit方法,減少worker執行緒數的邏輯。
} finally
}
processworkerexit方法邏輯:
private void processworkerexit(worker w, boolean completedabruptly) finally
//嘗試將執行緒池狀態設定成terminate,能夠設定的條件是:當前執行緒池狀態是shutdown並且任務佇列無任務或stop狀態
//如果當前可設定成terminate狀態,並且還有worker執行緒存在,則中斷它
//然後設定執行緒池狀態為tidying:到達這個狀態則說明當前執行緒數為0了,並且整個執行緒池已無任務。
//最後加鎖執行terminate方法。這裡是空方法,子類可以實現特列邏輯。
tryterminate();
int c = ctl.get();
//下面的**主要是看是否需要建立新的worker用於替換這個釋放掉的worker
//兩種情況會需要建立新的worker。
//1.當前被釋放的worker由於異常**
//2.當前是正常退出(由於之前執行緒超過核心執行緒數或者由於超過最大執行緒數,或者是檢測到了shutdown訊號)
//然後發現這時發現還有任務待執行,則建立乙個worker
if (runstatelessthan(c, stop))
addworker(null, false);//建立worker,底層還是會根據執行緒池及是否有任務等情況看是否需要建立
}}
Java執行緒池三
newcachedthreadpoll建立乙個可快取的執行緒池,如果執行緒池的大小超過了處理任務的所需要的執行緒,那麼就會 部分空閒的執行緒 60秒不執行任務 當任務數增加時,執行緒池又可以智慧型的新增新執行緒來處理任務,此執行緒池不會對大小做限制,執行緒池大小完全依賴於jvm能夠建立的最大執行緒大...
Java執行緒池
executors類詳解 此包中所定義的 executor executorservice scheduledexecutorservice threadfactory 和 callable 類的工廠和實用方法。此類支援以下各種方法 建立並返回設定有常用配置字串的 executorservice 的...
Java執行緒池
一 執行緒池 單執行緒 public static void runsinglethreadpool public static void runsinglethreadpoolwithfactory private static class mythreadfactory implements t...