執行緒池建立問題

2021-09-29 17:40:31 字數 2044 閱讀 9218

引數含義

從這四個函式來看,其實是分是否需要預設的執行緒池工廠和handler。接下來就講講這些引數代表什麼。

corepoolsize:核心執行緒數量。當執行緒數少於corepoolsize的時候,直接建立新的執行緒,儘管其他執行緒是空閒的。當執行緒池中的執行緒數目達到corepoolsize後,就會把到達的任務放到快取佇列當中;

maximunpoolsize:執行緒池最大執行緒數。如果執行緒數量少於執行緒最大數且大於核心執行緒數量的時候,只有當阻塞佇列滿了才建立新執行緒。當執行緒數量大於最大執行緒數且阻塞佇列滿了這時候就會執行一些策略來響應該執行緒。

workqueue:阻塞佇列,儲存等待執行的任務,會對執行緒池的執行產生很大的影響。當提交乙個新的任務到執行緒池的時候,執行緒池會根據當前執行緒數量來選擇不同的處理方式

如果想降低系統資源消耗,包括cpu使用率,作業系統資源消耗,上下文切換開銷等等,可以設定乙個較大的佇列容量,較小的maximunpoolsize。如果執行緒經常發生阻塞,那麼可以稍微將maximunpoolsize設定大一點

handler:拒絕策略。當workqueue滿了,並且沒有空閒的執行緒數,即執行緒達到最大執行緒數。就會有四種不同策略來處理

直接丟擲異常(預設)

丟棄佇列中最靠前的任務,並執行當前任務

直接丟棄當前任務

corepoolsize 核心執行緒數

直接丟擲異常(預設)

丟棄佇列中最靠前的任務,並執行當前任務

直接丟棄當前任務

submit():提交任務,能夠返回執行結果execute+future

shutdown():關閉執行緒池,等待任務都執行完

shutdownnow():關閉執行緒池,不等待任務執行完

gettaskcount():執行緒池已執行和未執行的任務總數

getcompletedtaskcount():已完成的任務數量

getpoolsize():執行緒池當前執行緒數量

getactivecount():當前執行緒池中正在執行任務的執行緒數量

fixedthreadpool是固定核心執行緒的執行緒池,固定核心執行緒數由使用者傳入

newsinglethreadexecutor:建立的是單執行緒化的執行緒池,只會用唯一乙個工作執行緒執行任務,可以指定按照是否是先入先出,還是優先順序來執行任務。同樣使用無界佇列,核心執行緒數和最大執行緒數都是1個,同樣keepalivetime為0,可選擇是否使用預設執行緒工廠。

singlethreadexecutor是單執行緒執行緒池,只有乙個核心執行緒

​ 當乙個任務提交時,首先會建立乙個核心執行緒來執行任務,如果超過核心執行緒的數量,將會放入佇列中,因為linkedblockingqueue是長度為integer.max_value的佇列,可以認為是無界佇列,因此往佇列中可以插入無限多的任務,在資源有限的時候容易引起oom異常,同時因為無界佇列,maximumpoolsize和keepalivetime引數將無效,壓根就不會建立非核心執行緒

newcachedthreadpool:設定乙個可快取的執行緒池,當執行緒池長度超過處理的需要,可以靈活**空閒執行緒,如果沒有可以**的才新建執行緒。沒有核心執行緒數,當執行緒沒有任務60s之後就會**空閒執行緒,使用有界佇列。同樣可以選擇是否使用預設執行緒工廠。

cachedthreadpool是乙個根據需要建立新執行緒的執行緒池

當乙個任務提交時,corepoolsize為0不建立核心執行緒,synchronousqueue是乙個不儲存元素的佇列,可以理解為隊裡永遠是滿的,因此最終會建立非核心執行緒來執行任務。對於非核心執行緒空閒60s時將被**。因為integer.max_value非常大,可以認為是可以無限建立執行緒的,在資源有限的情況下容易引起oom異常

newscheduledthreadpool:支援執行緒定時操作和週期性操作。

執行緒池執行邏輯說明:

拒絕策略

拒絕策略 => 預設採用的是abortpolicy拒絕策略,直接在程式中丟擲rejectedexecutionexception異常【因為是執行時異常,不強制catch】,這種處理方式不夠優雅。處理拒絕策略有以下幾種比較推薦:

執行緒池的建立問題

執行緒池不允許使用executors 去建立,而是通過threadpoolexecutor 的方式,這樣的處理方式讓寫的同學更加明確執行緒池的執行規則,規避資源耗盡的風險。說明 executors 返回的執行緒池物件的弊端如下 1 fixedthreadpool 和singlethreadpool ...

執行緒池建立

executors執行緒池建立,主要包含以下幾種方式 1 第一種 測試 提交15個執行時間需要3秒的任務,看執行緒池的狀況 param threadpoolexecutor 傳入不同的執行緒池,看不同的結果 throws exception public void testcommon thread...

執行緒池 Executors類建立執行緒池

executors靜態工廠建立幾種常用執行緒池 1.建立了乙個固定執行緒數量的執行緒池,可以控制線程最大併發數,超出的執行緒會在佇列中等待。newfixedthreadpool int nthreads 執行緒池中線程數量是要指定傳入的,注意在固定大小的執行緒池中使用的阻塞佇列是linkedbloc...