ThreadPoolExecutor – 核心和最大池大小

当在方法execute(java.lang.Runnable)提交新任务并且运行的线程少于corePoolSize ,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求。

1)如果有空闲线程,为什么需要创建一个新线程来处理请求?

如果有多个corePoolSize但运行的maximumPoolSize线程少于maximumPoolSize ,则只有在队列已满时才会创建新线程。

2)我不明白corePoolSizemaximumPoolSize之间的区别。 其次,当线程小于maximumPoolSize时,如何将队列填满? 如果线程等于或大于maximumPoolSize则队列只能是满的。 不是吗?

以下是Sun关于线程创建的简单规则:

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

全文

您可以在javadoc中找到术语corepoolsize和maxpoolsize的定义。 http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html

上面的链接可以解答您的问题。 但是,只是为了说清楚。 应用程序将创建线程,直到它到达corePoolSize。 这意味着这些线程数应足以处理任务的流入。 之后,任务将排队。 一旦队列已满,执行程序将开始创建新线程。 这是一种平衡。 它本质上意味着任务的流入超过了处理能力。 因此,Executor将再次开始创建新线程,直到达到最大线程数。 同样,当且仅当队列已满时,才会创建新线程。

核心和最大池大小

ThreadPoolExecutor将根据corePoolSize和maximumPoolSize设置的边界自动调整池大小。

当在方法execute(java.lang.Runnable)提交新任务并且运行的线程少于corePoolSize时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求。 如果有多个corePoolSize但运行的maximumPoolSize线程少于,则只有在队列已满时才会创建新线程。通过设置corePoolSize和maximumPoolSize相同,可以创建固定大小的线程池。

通过将maximumPoolSize设置为基本无限制的值(例如Integer.MAX_VALUE ,可以允许池容纳任意数量的并发任务。 最典型的情况是,核心和最大池大小仅在构造时设置,但也可以使用setCorePoolSize(int)setMaximumPoolSize(int)动态更改。 链接