多執行緒9 執行緒池

2021-10-25 22:28:41 字數 2900 閱讀 5013

從原始碼中可以看出,執行緒池的建構函式有7個引數,分別是corepoolsize、maximumpoolsize、keepalivetime、unit、workqueue、threadfactory、handler

一、corepoolsize 執行緒池核心執行緒大小

執行緒池中會維護乙個最小的執行緒數量,即使這些執行緒處理空閒狀態,他們也不會被銷毀,除非設定了allowcorethreadtimeout。這裡的最小執行緒數量即是corepoolsize。

二、maximumpoolsize 執行緒池最大執行緒數量

乙個任務被提交到執行緒池以後,首先會找有沒有空閒存活執行緒,如果有則直接將任務交給這個空閒執行緒來執行,如果沒有則會快取到工作佇列(後面會介紹)中,如果工作佇列滿了,才會建立乙個新執行緒,然後從工作佇列的頭部取出乙個任務交由新執行緒來處理,而將剛提交的任務放入工作佇列尾部。執行緒池不會無限制的去建立新執行緒,它會有乙個最大執行緒數量的限制,這個數量即由maximunpoolsize指定。

三、keepalivetime 空閒執行緒存活時間

乙個執行緒如果處於空閒狀態,並且當前的執行緒數量大於corepoolsize,那麼在指定時間後,這個空閒執行緒會被銷毀,這裡的指定時間由keepalivetime來設定

四、unit 空閒執行緒存活時間單位

keepalivetime的計量單位

五、workqueue 工作佇列

新任務被提交後,會先進入到此工作佇列中,任務排程時再從佇列中取出任務。jdk中提供了四種工作佇列:

①arrayblockingqueue

基於陣列的有界阻塞佇列,按fifo排序。新任務進來後,會放到該佇列的隊尾,有界的陣列可以防止資源耗盡問題。當執行緒池中線程數量達到corepoolsize後,再有新任務進來,則會將任務放入該佇列的隊尾,等待被排程。如果佇列已經是滿的,則建立乙個新執行緒,如果執行緒數量已經達到maxpoolsize,則會執行拒絕策略。

②linkedblockingquene

基於鍊錶的無界阻塞佇列(其實最大容量為interger.max),按照fifo排序。由於該佇列的近似無界性,當執行緒池中線程數量達到corepoolsize後,再有新任務進來,會一直存入該佇列,而不會去建立新執行緒直到maxpoolsize,因此使用該工作佇列時,引數maxpoolsize其實是不起作用的。

③synchronousquene

乙個不快取任務的阻塞佇列,生產者放入乙個任務必須等到消費者取出這個任務。也就是說新任務進來時,不會快取,而是直接被排程執行該任務,如果沒有可用執行緒,則建立新執行緒,如果執行緒數量達到maxpoolsize,則執行拒絕策略。

④priorityblockingqueue

具有優先順序的無界阻塞佇列,優先順序通過引數comparator實現。

六、threadfactory 執行緒工廠

建立乙個新執行緒時使用的工廠,可以用來設定執行緒名、是否為daemon執行緒等等

七、handler 拒絕策略

當工作佇列中的任務已到達最大限制,並且執行緒池中的執行緒數量也達到最大限制,這時如果有新任務提交進來,該如何處理呢。這裡的拒絕策略,就是解決這個問題的,jdk中提供了4中拒絕策略

該策略下,在呼叫者執行緒中直接執行被拒絕任務的run方法,除非執行緒池已經shutdown,則直接拋棄任務。

②abortpolicy

該策略下,直接丟棄任務,並丟擲rejectedexecutionexception異常。

③discardpolicy

該策略下,直接丟棄任務,什麼都不做。

④discardoldestpolicy

該策略下,拋棄進入佇列最早的那個任務,然後嘗試把這次拒絕的任務放入佇列

無限長線程池cachedthreadpool

從原始碼可以看出cachedthreadpool所使用的執行緒最大數量為integer.max_value,也就是說在執行過程中只要前面的任務沒有完成,那麼執行緒數量就不斷增加,這樣的話會產生大量執行緒使用過程可能存在棧溢位的問題。

定長線程池fixedthreadpool

定長線程池限制了最大的執行緒數量,解決了不定長線程池cachedthreadpool的無限執行緒的問題。然而定長的執行緒池使用了無限長的鏈式阻塞佇列,這個佇列無限大,如果任務執行慢且記憶體占用較多時,jvm會產生記憶體溢位。

了解jmh

多執行緒 執行緒池

第一 降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷毀造成的消耗。第二 提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。第三 提高執行緒的可管理性。執行緒是稀缺資源,如果無限制地建立,不僅會消耗系統資源,還會降低系統的穩定性,使用執行緒池可以進行統一分配 調優和監控...

多執行緒 執行緒池

執行緒池是什麼 執行緒池 thread pool 是一種基於池化思想管理執行緒的工具,經常出現在多執行緒伺服器中,如mysql。執行緒過多會帶來額外的開銷,其中包括建立銷毀執行緒的開銷 排程執行緒的開銷等等,同時也降低了計算機的整體效能。執行緒池維護多個執行緒,等待監督管理者分配可併發執行的任務。這...

多執行緒 執行緒池

執行緒池的作用 減少了每次建立 銷毀執行緒所帶來的損耗。執行緒池建立執行緒的簡易流程 文字描述 1 先判斷核心執行緒池 corepoolsize 是否已滿,沒滿就建立核心執行緒執行,滿了就進行下一判斷。2 判斷等待佇列 workqueue 是否已經滿了,沒滿就新增到等待佇列,滿了就進行下一判斷。3 ...