為什么 Spring 的 ThreadPoolTaskExecutor 不斷創建達到 Core Size 值的線程,無論現有線程是否空閑! ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(300);
executor.setMaxPoolSize(500);
executor.setQueueCapacity(5000);
executor.setThreadNamePrefix("AsyncTask-");
executor.initialize();我一個接一個地發出請求,它不斷增加線程數量,直到達到 300。我的問題是,如果現有線程空閑,為什么它不使用空閑線程?一旦達到核心池大小,無論如何僅使用池中的線程。
2 回答

aluckdog
TA貢獻1847條經驗 獲得超7個贊
根據 java 文檔,Spring 在這里要做的事情較少
當在方法execute(Runnable)中提交新任務并且正在運行的線程少于corePoolSize時,即使其他工作線程處于空閑狀態,也會創建一個新線程來處理該請求。如果運行的線程數大于 corePoolSize 但小于 MaximumPoolSize,則僅當隊列已滿時才會創建新線程

墨色風雨
TA貢獻1853條經驗 獲得超6個贊
核心線程池大小指定要保持準備狀態以處理任何潛在工作的線程數量,以避免創建新線程的開銷。指定 300 是要求線程池始終維護 300 個線程,您不應該期望它在滿足該數量之前重用。如果這個值太高,請考慮減少 corePoolSize,同時保持 maxPoolSize 不變,當池過載時,它會擴大。查看 ThreadPoolTaskExecutor 的setAllowCoreThreadTimeOut在不使用時將線程池縮小到 corePoolSize 以下。
添加回答
舉報
0/150
提交
取消