ThreadPoolExecutor – 核心和最大池大小
当在方法
execute(java.lang.Runnable)
提交新任务并且运行的线程少于corePoolSize
,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求。
1)如果有空闲线程,为什么需要创建一个新线程来处理请求?
如果有多个
corePoolSize
但运行的maximumPoolSize
线程少于maximumPoolSize
,则只有在队列已满时才会创建新线程。
2)我不明白corePoolSize
和maximumPoolSize
之间的区别。 其次,当线程小于maximumPoolSize
时,如何将队列填满? 如果线程等于或大于maximumPoolSize
则队列只能是满的。 不是吗?
以下是Sun关于线程创建的简单规则:
- 如果线程数小于corePoolSize,则创建一个新线程以运行新任务。
- 如果线程数等于(或大于)corePoolSize,则将任务放入队列。
- 如果队列已满,并且线程数小于maxPoolSize,则创建一个新线程以运行任务。
- 如果队列已满,并且线程数大于或等于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)
动态更改。 链接