为什么无论现有线程是否空闲,Spring的ThreadPoolTaskExecutor都继续创建最大为Core Size值的线程!
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(300);
executor.setMaxPoolSize(500);
executor.setQueueCapacity(5000);
executor.setThreadNamePrefix("AsyncTask-");
executor.initialize();
我一一触发了请求,并一直增加线程数量,直到达到300。我的问题是现有线程是否空闲,为什么不使用空闲线程?一旦达到核心池大小,就只能使用池中的线程。
答案 0 :(得分:2)
根据Java文档here
,Spring在这里要做的事情很少在方法execute(Runnable)中提交新任务时,更少 当corePoolSize线程正在运行时,将创建一个新线程来 处理请求,即使其他工作线程处于空闲状态也是如此。如果有 大于corePoolSize但小于maximumPoolSize线程 正在运行,仅当队列已满时才会创建新线程
答案 1 :(得分:1)
核心线程池大小指定要准备处理任何潜在工作以避免创建新线程的开销的线程数。指定300要求一个始终保持300个线程的线程池,您不应期望它在满足数量之前就可以重用。如果此值太高,请考虑在保持相同的maxPoolSize的同时减小corePoolSize,当池超载时,它会放大。 在不使用时,请查看ThreadPoolTaskExecutor的setAllowCoreThreadTimeOut以将线程池缩小到corePoolSize以下。