18

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

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

如果运行的线程多于corePoolSize但少于maximumPoolSize线程数,则仅当队列已满时才会创建一个新线程。

corePoolSize2)我不明白和maximumPoolSize这里的区别。其次,当线程少于 时,队列怎么会满maximumPoolSize?只有线程数等于或大于 时,队列才能满maximumPoolSize。不是吗?

4

3 回答 3

26

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

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

全文

于 2016-01-27T04:37:42.700 回答
8

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

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

于 2013-09-02T10:37:27.637 回答
6

核心和最大池大小

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

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

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

于 2014-01-29T22:16:37.280 回答