2013-07-15 81 views
13

当一个新的任务,方法execute(java.lang.Runnable)被提交,只有不到corePoolSize线程在运行,创建一个新的线程来处理请求,即使其他辅助线程是空闲的。的ThreadPoolExecutor - 核心和最大池大小

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

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

2)我不明白corePoolSizemaximumPoolSize这里的区别。其次,当线程小于maximumPoolSize时,如何满足一个队列?如果线程等于或大于maximumPoolSize,队列只能是满的。不是吗?

+1

1.如何执行()知道你的其他工作线程处于空闲状态?当你完成它们后,你把它们还给了游泳池吗? –

+0

2.听起来像ThreadPoolExecutor试图维护一个比corePoolSize大但小于maximumPoolSize的可用线程池。 –

+0

@RobertHarvey请发表这个答案。 – zEro

回答

8

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

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

5

核心和最大池大小

甲的ThreadPoolExecutor将根据corePoolSize和maximumPoolSize设定的界限自动调整池大小。

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

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

+0

请尝试格式化您的答案以提高可读性。 – harpun

14

下面是Sun的深入浅出的线程创建规则:

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

Full article