ThreadPoolExecutor - 核心和最大池大小

时间:2013-07-15 17:20:54

标签: java threadpoolexecutor

  

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

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

  

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

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

3 个答案:

答案 0 :(得分:21)

以下是Sun用简单术语创建线程的规则:

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:6)

核心和最大泳池数量

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

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

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