线程池任务执行器

Thread Pool Task Executor

为什么 Spring 的 ThreadPoolTask​​Executor 继续创建线程达到 Core Size 值,无论现有线程是否空闲!

    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(300);
    executor.setMaxPoolSize(500);
    executor.setQueueCapacity(5000);
    executor.setThreadNamePrefix("AsyncTask-");
    executor.initialize();

我一个一个地发出请求,它一直在增加线程数,直到达到 300。我的问题是,如果现有线程空闲,为什么它不使用空闲线程?一旦达到核心池大小,无论如何仅使用池中的线程。

Spring 根据 java 文档 here

此处无事可做

When a new task is submitted in method execute(Runnable), and fewer than corePoolSize threads are running, a new thread is created to handle the request, even if other worker threads are idle. If there are more than corePoolSize but less than maximumPoolSize threads running , a new thread will be created only if the queue is full

核心线程池大小指定准备好处理任何潜在工作的线程数,以避免创建新线程的开销。指定 300 是要求一个始终保持 300 个线程的线程池,您不应该期望它在达到该数量之前重用。如果这太高,请考虑减少 corePoolSize,同时保持相同的 maxPoolSize,当池过载时它会扩大。 查看 ThreadPoolTask​​Executor 的 setAllowCoreThreadTimeOut 以在不使用时将线程池缩小到 corePoolSize 以下。