java執行緒池深入三 Worker

2021-08-04 04:48:11 字數 2186 閱讀 8325

一.目的

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...