线程池任务执行器
Thread Pool Task Executor
为什么 Spring 的 ThreadPoolTaskExecutor 继续创建线程达到 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,当池过载时它会扩大。
查看 ThreadPoolTaskExecutor 的 setAllowCoreThreadTimeOut 以在不使用时将线程池缩小到 corePoolSize 以下。
为什么 Spring 的 ThreadPoolTaskExecutor 继续创建线程达到 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,当池过载时它会扩大。 查看 ThreadPoolTaskExecutor 的 setAllowCoreThreadTimeOut 以在不使用时将线程池缩小到 corePoolSize 以下。