執行緒池的理解

2021-10-04 02:32:01 字數 1390 閱讀 2466

學校組織體檢,有一項內容是抽血化驗. 抽血是在乙個房間*(執行緒池)裡進行,

假設:房間裡面有6個核心視窗進行抽血(corepoolsize)*,如果來抽血化驗的人太多,核心視窗也可以擴容,最大可以擴充套件到10個視窗.(maximumpoolsize): 其中有6個核心視窗,和4個非核心視窗. 非核心視窗在抽血化驗人不多,沒有工作量超過設定時間2000ms(keepalivetime),就關掉了,節省資源. 但核心視窗會一直保持開著.

房間裡還有乙個等候休息區*(blockingqueue)*,等候區最多允許進去5個人在這等候抽血.

threadpoolexecutor executor = new threadpoolexecutor(6, 10, 2000, timeunit.milliseconds, new arrayblockingqueue<>(5));

那麼我們可以算出:房間允許進入的最大抽血人數(包括等候抽血的人)=10+5=15人.

當呼叫execute()方法新增乙個請求任務時,執行緒池會做如下判斷:

1 如果正在執行的執行緒數量小於corepoolsize,那麼馬上建立執行緒執行這個任務:

2 如果正在執行的執行緒數量大於或等於corepoolsize,那麼將這個任務放入佇列;

3 如果這時候佇列滿了且正在執行的執行緒數量還小maximumpoolsize,那麼還是要建立非核心執行緒立刻執行這個任務:

4 如果佇列滿了且正在執行的執行緒數量大於或等於maximumpoolsize,那麼執行緒池會啟動飽和拒絕策略來執行。

public

class

threadpoolexecutortest

system.out.

println

("執行緒池中線程數目:"

+ executor.

getpoolsize()

+",任務佇列中等待執行的任務數目:"

+ executor.

getqueue()

.size()

+",計畫執行的任務總數目:"

+ executor.

gettaskcount()

);} executor.

shutdownnow()

;}static

class

myrunnable

implements

runnable

catch

(interruptedexception e)

system.out.

println

(threadname +

"執行完成......");

}}}

執行緒池的理解

原來一直對執行緒池心存疑惑.第乙個疑惑是.執行緒類在例項化的時候就已經指定了run函式了,也就是說,乙個執行緒在例項化的時候,他能做什麼就已經定下來了,要做別的事,就要新開乙個執行緒.這感覺就和執行緒池的思想違背了,怎麼樣從執行緒池裡面拿乙個執行緒出來就可以執行呢?執行完了然後再放回去呢?第二個疑惑...

執行緒池的理解

1.為什麼要使用多執行緒?充分利用cpu資源,併發去做多個事情 2.單核cpu機器適不適合用多執行緒?適合,如果是單執行緒,執行緒中需要等待io,此時cpu就空閒出來了 3.執行緒什麼時候讓出cpu?阻塞時,wait,await,等待io,sleep,yield,結束了 4.執行緒是什麼?程序的最小...

理解執行緒池

建立執行緒池的一種方式 threadpoolexecutor threadpoolexecutor new threadpoolexecutor corepoolsize,maximumpoolsize,keepalivetime,unit,workqueue,threadfactory,handl...