學校組織體檢,有一項內容是抽血化驗. 抽血是在乙個房間*(執行緒池)裡進行,
假設:房間裡面有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...