ThreadPoolExecutor - 核心和最大池大小

2022-09-02 12:03:10

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

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

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

2)我不明白和这里之间的区别。其次,当线程小于时,队列如何填满?仅当线程等于或大于 时,队列才能已满。不是吗?corePoolSizemaximumPoolSizemaximumPoolSizemaximumPoolSize


答案 1

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

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

全文


答案 2

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

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


推荐