程序 執行緒 執行緒池的相關知識

2021-10-20 05:12:34 字數 1817 閱讀 1262

什麼是程序,什麼是執行緒

程序是資源分配的最小單位,執行緒是cpu排程的最小單位

乙個應用程式的執行就可以被看做是乙個程序,而執行緒是執行中的實際的任務執行者。可以說,程序中包含了多個可以同時執行的執行緒。

我們在建立執行緒池的時候一般使用它的子類threadpoolexecutor.

public threadpoolexecutor(int corepoolsize, int maximumpoolsize, long keepalivetime, timeunit unit, blockingqueueworkqueue,  

threadfactory threadfactory,  

rejectedexecutionhandler handler)

這是threadpoolexecutor的乙個構造方法,這個方法決定了建立出來的執行緒池的各種屬性。

任務進來時,首先執行判斷,判斷是否有核心執行緒處於空閒狀態,如果有,核心執行緒就先執行任務,如果核心執行緒沒有,則判斷任務佇列是否已滿,如果沒有,就將任務儲存在任務佇列中,等待執行,如果滿了,再看執行緒池最大可容納的執行緒數,如果沒有超出這個數量,就建立非核心執行緒執行任務,如果超出了,就呼叫handler實現拒絕策略。

handler的拒絕策略:

有四種:第一種abortpolicy:不執行新任務,直接丟擲異常,提示執行緒池已滿

第二種discardpolicy:不執行新任務,也不丟擲異常

第三種discardoldsetpolicy:將訊息佇列中的第乙個任務替換為當前新進來的任務執行

第四種callerrunspolicy:直接呼叫execute來執行當前任務

五,四種常見的執行緒池:

知道了各個引數的作用後,我們開始構造符合我們期待的執行緒池。首先看jdk給我們預定義的幾種執行緒池:

cachedthreadpool:該執行緒池中沒有核心執行緒,非核心執行緒的數量為integer.max_value,就是無限大,當有需要時建立執行緒來執行任務,沒有需要時**執行緒,適用於耗時少,任務量大的情況。

scheduledthreadpool:週期性執行任務的執行緒池,按照某種特定的計畫執行執行緒中的任務,有核心執行緒,但也有非核心執行緒,非核心執行緒的大小也為無限大。適用於執行週期性的任務。

singlethreadpool:只有乙個執行緒來執行任務,適用於有順序的任務的應用場景。

fixedthreadpool:定長的執行緒池,只有核心執行緒,沒有非核心執行緒,核心執行緒的即為最大的執行緒數量。

我們也可以通過向建構函式中傳參的方式自定義執行緒池。通過自定義執行緒池,我們可以更好的讓執行緒池為我們所用,更加適應我的實際場景。

執行緒池的大小應該怎麼設定呢?

一般說來,大家認為執行緒池的大小經驗值應該這樣設定:(其中n為cpu的個數)

如果是cpu密集型應用,則執行緒池大小設定為n+1

如果是io密集型應用,則執行緒池大小設定為2n+1

如果一台伺服器上只部署這乙個應用並且只有這乙個執行緒池,那麼這種估算或許合理,具體還需自行測試驗證。但是,io優化中,這樣的估算公式可能更適合:最佳執行緒數目 = ((執行緒等待時間+執行緒cpu時間)/執行緒cpu時間 )* cpu數目因為很顯然,執行緒等待時間所佔比例越高,需要越多執行緒。執行緒cpu時間所佔比例越高,需要越少執行緒。下面舉個例子:比如平均每個執行緒cpu執行時間為0.5s,而執行緒等待時間(非cpu執行時間,比如io)為1.5s,cpu核心數為8,那麼根據上面這個公式估算得到:((0.5+1.5)/0.5)*8=32。這個公式進一步轉化為:最佳執行緒數目 = (執行緒等待時間與執行緒cpu時間之比 + 1)* cpu數目剛剛說到的執行緒池大小的經驗值,其實是這種公式的一種估算值。

參考部落格:

程序,執行緒池,執行緒

執行緒池的五個狀態 running 可以接受新的任務,也可以處理阻塞佇列裡的任務 shutdown 不能接受新的任務,可以處理阻塞佇列裡的任務,running 狀態下呼叫 shutdown 函式會裝變成 shutdown 狀態stop 不能接受新的任務,也不能處理阻塞佇列裡的任務,running 狀...

C 多執行緒 非同步執行緒 執行緒池相關知識

執行緒池threadpool類會在需要時增減池中線程的執行緒數,直到最大的執行緒數。池中的最大執行緒數是可配置的。在雙核cpu中,預設設定為1023個工作執行緒和1000個i o執行緒。也可以指定在建立執行緒池時應立即啟動的最小執行緒數,以及執行緒池,中可用的最大執行緒數。如果有更多的作業要處理,執...

程序池 執行緒池

程序池和執行緒池相似,所以這裡我們以程序池為例介紹,下面對程序池的討論完全適用於執行緒池 如果沒有特殊宣告 程序池是由伺服器預先建立的一組子程序,這些子程序的數目在3 10個之間 典型情況 執行緒池的數量應該和cpu數量差不多。程序池中的所有子程序都執行者相同的 並具有相同的屬性。因為程序池在伺服器...