簡述執行緒池

2021-10-25 09:03:06 字數 1157 閱讀 5351

首先我們來了解下執行緒池的相關概念,執行緒池是什麼。池,是容器,那顧名思義執行緒池就是管理執行緒的容器。

很自然的我們會引出乙個問題,就是為什麼要使用執行緒池,而不是自己去管理多執行緒?在多執行緒應用場景中,會不斷建立和銷毀新的執行緒,而這會耗費大量的io資源,這樣過度消耗系統資源則有可能會導致系統奔潰,為了避免這種情況,我們就有了執行緒池。

上面已經講到了執行緒池是容器,是管理和排程執行緒的容器,其核心思想就是,允許我們去多次重複使用執行緒而不是去建立新的執行緒。執行緒池在系統啟動時,就會建立一定量的空閒執行緒,程式將乙個任務傳遞給執行緒池時,執行緒池就會啟動乙個執行緒來完成這個任務,在執行結束後,這個執行緒並不會被銷毀,而是被執行緒池**成為空閒狀態等待下個任務的到來。

核心執行緒數,核心執行緒在預設情況下會一直存在即使處於空閒狀態,即在沒有任務的情況下執行緒池持有執行緒數。如果指定allowcorethreadtimeout為true,則在沒有任務執行超過一定時間後,也會被銷毀,所以這個引數在該情況下確切來說就成了核心執行緒最大數。

執行緒池當前持有執行緒數,當poolsize為0時,執行緒池關閉,而且需要注意,執行緒池在任意時刻都存在 poolsize <= maximumpoolsize

執行緒池允許的最大執行緒數,需要注意:

非核心執行緒存活時間,當非核心執行緒空閒時間超過設定的keepalivetime時,就會被**,當allowcorethreadtimeout為true時,該設定也會作用於核心執行緒

維護等待執行的runnable物件,當所有的核心執行緒都在幹活時,新新增的任務會被新增到這個佇列中等待處理,如果佇列滿了,則新建非核心執行緒執行任務,常見的workqueue型別有:

任務拒絕策略,當阻塞佇列滿了,且執行緒池中的執行緒數達到maximumpoolsize,如果繼續提交任務,就會採取任務拒絕策略處理該任務,執行緒池提供了4種任務拒絕策略:

同時jdk也為我們提供了rejectedexecutionhandler介面,可以根據實際應用場景去自定義策略

可快取執行緒池:執行緒數量無限制,如果執行緒池內有空閒執行緒就使用空閒執行緒執行任務,否則建立新執行緒

定長線程池:可控制線程最大併發數,超出的執行緒會在佇列中等待。

定長線程池:支援定時及週期性任務執行

單例化執行緒池:有且僅有乙個工作執行緒執行任務,所有任務按照指定順序執行,即遵循佇列的入隊出隊規則

執行緒池原理和機制簡述

一 結構 執行緒池一般有core 執行緒數,最大執行緒數和快取佇列 阻塞佇列 組成。二 執行緒復用原理 執行緒池裡面的執行緒 真正執行緒,start 方法啟動的 執行業務執行緒物件 thread 或者runable 物件,但不是真正的執行緒 的run 非start方法 方法。三 執行緒池邏輯 四 常...

執行緒池總類以及執行緒池的核心引數簡述

jdk自帶執行緒池總類 1 newfixedthreadpool建立乙個指定工作執行緒數量的執行緒池。每當提交乙個任務就建立乙個工作執行緒,如果工作執行緒數量達到執行緒池初始的最大數,則將提交的任務存入到池佇列中。2 newcachedthreadpool建立乙個可快取的執行緒池。這種型別的執行緒池...

簡述Linux C下執行緒池的使用

執行緒池也是多執行緒的處理方式。是將 生產者 執行緒提出任務新增到 任務佇列 然後一些執行緒自動完成 任務佇列 上的任務。多執行緒程式設計,建立乙個執行緒,指定去完成某乙個任務,等待執行緒的退出。雖然能夠滿足程式設計需求,但是當我們需要建立大量的執行緒的時候,在建立過程以及銷毀執行緒的過程中可能會消...