我有一個應用程式,我做了如下的執行緒配置,
我有一個應用程式,我做了如下的執行緒配置。
corepoolsize = 10
Maxpoolsize = 10
queuecapacity = 10
但是當我使用執行緒和運行在執行緒上的函式(異步行程)時 我看到它像下面一樣在增加,但我沒有看到執行緒在減少。這是記憶體泄漏的跡象嗎?有人能指導我嗎?
日志列印是這樣的,
2021-09-15 01:13: 48. 554 INFO 111 -- [Async-1]
2021-09-15 01:13:48. 654 INFO 121 -- [Async-2]
2021-09-15 01:13:48. 754 INFO 132 -- [Async-3]
2021-09-15 01:13:48. 854 INFO 140 -- [Async-4]
2021-09-15 01:13:48. 954 INFO 155 -- [Async-5]
2021-09-15 01:13:49. 554 INFO 160 -- [Async-6]
但是我沒有看到它像那樣再次呼叫[Async-1], [Async-2]。這是記憶體泄漏還是執行緒快取,或者在填滿corepoolsize之后,它會不會運行[Async-1]?
uj5u.com熱心網友回復:
Corepoolsize代表始終活著的作業執行緒。
你可以檢查ThreadPoolExecutor#runWorker,ThreadPoolExecutor#getTask方法,這些作業執行緒將始終嘗試從任務佇列中獲取任務并執行它們。因此,如果沒有新的任務被發布到執行緒池中,那么這些作業執行緒將一直存在,通常被封鎖在workQueue的take方法中,所以你不必擔心cpu空轉。
超出corepoolsize數量的作業執行緒將被回收,仍然是ThreadPoolExecutor#getTask方法:
try {
Runnable r = timed ?
workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
workQueue.take()。
if (r != null)
return r;
timedOut = true;
} catch (InterruptedException retry) {
timedOut = false;
}
這些要被回收的執行緒最多可以存活keepAliveTime時間。
執行緒池使用一個Hash表來保存執行緒的參考,這樣就可以通過添加和洗掉參考等操作來控制執行緒的生命周期。(ThreadPoolExecutor#processWorkerExit方法)。
uj5u.com熱心網友回復:
這是預期的行為。ThreadPoolExecutor的檔案明確指出:
當在方法 execute(Runnable)中提交一個新任務時,如果運行的執行緒少于 corePoolSize,則會創建一個新執行緒來處理該請求,即使其他作業執行緒處于空閑狀態。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/308779.html
標籤:
