当在方法
execute(java.lang.Runnable)
中提交新任务且运行的线程少于corePoolSize
时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求。
1)如果有空闲线程,为什么需要创建一个新线程来处理请求?
如果有超过
corePoolSize
但少于maximumPoolSize
个线程正在运行,则只有在队列已满时才会创建新线程。
2)我不明白corePoolSize
和maximumPoolSize
之间的区别。其次,当线程小于maximumPoolSize
时,如何将队列填满?如果线程等于或大于maximumPoolSize
,则队列只能是满的。不是吗?
答案 0 :(得分:21)
以下是Sun用简单术语创建线程的规则:
答案 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