Java多執行緒 執行緒池之初探

2021-08-21 18:37:52 字數 2083 閱讀 7965

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

這是執行緒池最核心的建構函式,搞明白這些引數的含義,執行緒池就算搞明白了一半。

corepoolsize 核心執行緒數,當你提交乙個任務時候,如果沒有達到核心執行緒數,就開闢乙個新執行緒來執行,這個執行緒為核心執行緒

maximumpoolsize  最大執行緒數,最大執行緒數 = 核心執行緒數+非核心執行緒數

keepalivetime   空閒存活時間,這個代表非核心執行緒如果沒有任務多久之後被清除掉。對應的執行緒池內部有個私有屬性allowcorethreadtimeout這個是boolean型別,預設為false,代表空閒狀態下的核心執行緒可以一直存活,如果為true那麼核心執行緒的待遇和非核心是一樣的

unit  時間單位,數學老師說沒有單位的結果都是沒有意義的,時間也是,這個是確定keepalivetime這個時間單位的

threadfactory  執行緒工廠,工廠模式大都了解一點,為了優雅的建立物件而生,那這個就是為了優雅的建立執行緒而生,方便記錄執行緒個數,給執行緒改名字,用執行緒組統一管理

rejectedexecutionhandler 拒絕策略可以自己實現,預設有四種選擇 ,放棄這個任務,異常,放棄舊任務執行剛剛提交的,在提交者執行緒中執行剛剛提交的任務

講解了這些引數的意義,那麼在實際上這些引數是怎麼起作用的呢?

回到執行緒池的本身作用,復用執行緒,不需要乙個任務就開闢乙個新執行緒去執行,只需要往執行緒池中提交任務即可,執行緒池會自動派執行緒去執行

那麼問題來了一次任務的提交的過程是什麼樣子?

jdk給我封裝好了四個常用執行緒池,當你清楚上面的引數含義和流程之後這四個執行緒池的原理一目了然

newsinglethreadexecutor

public static executorservice newsinglethreadexecutor()
核心執行緒,最大執行緒都為1,存活時間為0,時間為milliseconds,工作隊列為list的阻塞佇列,其他2個引數均為預設,很明顯,永遠只有乙個核心執行緒,執行緒永遠不會死,任務隊列為list,永遠不會滿,永遠不會增加非核心也就永遠不會觸發rejectedexecutionhandler

newfixedthreadpool

public static executorservice newfixedthreadpool(int nthreads)
核心執行緒和最大執行緒為輸入引數,其他同上,原理也很清晰,不在過多解釋

newcachedthreadpool

public static executorservice newcachedthreadpool()
核心執行緒是0,最大執行緒數為最大int,60s空閒就**執行緒,阻塞佇列是synchronousqueue不會儲存任何任務,直接交給執行緒去執行,換句話說這是一直滿的(其實不能這麼說,相當於這樣而已)這樣就一直開闢新執行緒去執行任務(沒有空閒執行緒的情況下),如果執行緒空閒下來就會60s**掉。

newscheduledthreadpool

public scheduledthreadpoolexecutor(int corepoolsize,

threadfactory threadfactory)

這個執行緒池繼承了threadpoolexecutor和其他有點不同,但是還是用的是threadpoolexecutor的建構函式,唯一區別是工作佇列的區別,佇列內元素必須實現delayed介面,這就意味著你傳進去的任務必須先實現delayed介面。這個佇列接收到任務時,首先先入隊,只有達到了指定的延時時間,才會執行任

java多執行緒 執行緒池

執行緒池的狀態含義 執行緒池引數 執行緒池種類 使用樣例 executors工廠類 執行緒池的調優策略 上乙個文章說多執行緒的實現方法有四個,其中第四個有提到exectorservice介面與callable與runnable,futrue等的一起實現,exectorservice是執行緒的管理工具...

Java多執行緒初探

單執行緒的程式只有乙個順序執行流。多個順序流之間互不干擾。定義thread類的子類,重寫該類的run 方法。建立thread子類的例項。呼叫執行緒物件的start 方法來啟動多執行緒。package ch16 created by jiqing on 2017 1 2.public class fi...

Java多執行緒初探

單執行緒的程式只有乙個順序執行流。多個順序流之間互不干擾。定義thread類的子類,重寫該類的run 方法。建立thread子類的例項。呼叫執行緒物件的start 方法來啟動多執行緒。package ch16 created by jiqing on 2017 1 2.public class fi...