Spring ThreadPoolTaskExecutor 中的 corePoolSize 和 maxPoolSize 有什么区别

2022-08-31 20:45:03

我必须向网站的所有用户发送大量电子邮件。我想为发送的每封电子邮件使用线程池。目前,我已将值设置为:

<property name="corePoolSize" value="500" />
<property name="maxPoolSize" value="1000" />

两者之间有什么区别,它会扩展吗?目前我有大约10000个用户。


答案 1

以下是 Sun 的线程创建规则:简单来说:

  1. 如果线程数小于 ,请创建一个新线程来运行新任务。corePoolSize
  2. 如果线程数等于(或大于),则将任务放入队列中。corePoolSize
  3. 如果队列已满,并且线程数小于 ,请创建一个新线程来运行任务。maxPoolSize
  4. 如果队列已满,并且线程数大于或等于 ,则拒绝该任务。maxPoolSize

全文

原点答案


答案 2

javadoc说得最好

当提交新任务 [...] 且运行的线程数少于 1 个时,将创建一个新线程来处理请求,即使其他工作线程处于空闲状态也是如此。如果运行的线程数多于但少于数,则仅当队列已满时,才会创建新线程。通过设置和相同方法,可以创建一个固定大小的线程池。通过设置为实质上无界的值(如 ),允许池容纳任意数量的并发任务。corePoolSizecorePoolSizemaximumPoolSizecorePoolSizemaximumPoolSizemaximumPoolSizeInteger.MAX_VALUE

至于您的具体情况,同时发送500封电子邮件是毫无意义的,您只会使邮件服务器不堪重负。如果您需要发送大量电子邮件,请使用单个线程,并一次发送一个。邮件服务器将比500个单独的连接更优雅地处理这个问题。