我试图理解为Java 5的ThreadPoolExecutor指定单独的核心和最大池大小的重点。我的理解是,一旦队列满了,线程数就会增加,这似乎有点晚(至少队列较大)。
我是不是很乐意为这些任务分配更多的线程,在这种情况下我可能会增加核心池的大小;或者我不是真的愿意这样做,在这种情况下我宁愿有更大的队列?什么是单独的核心和最大池大小有用的场景?
答案 0 :(得分:4)
讨论了这个here。
该池旨在在corePoolSize(to。)的正常负载下工作 除非使用预启动,否则它会加速)。当一个超载 条件发生(由更多待处理/进程中定义 我们使用队列充当缓冲区 - 用 期望在附近恢复正常的工作量 未来。如果我们担心过度过载,那么我们可以使用 有限的队列,并说“如果队列填满增加更多的工人 高达maxPoolSize“。如果我们使用无界的队列,我们说我们没有 期望(或者不关心)过度超负荷。
目的是平衡处理预期工作量的能力, 即使在瞬态过载下,也没有过多的线程 创造,没有太多的线程流失(即 创建工作模创建)。
答案 1 :(得分:2)
不同之处在于,如果您低于核心池大小,则每个新任务都会创建一个新线程,而不管池中的空闲线程如何。当您已经满足核心池大小但仍然低于最大值时,一旦队列已满,线程数就会增加。
这方面的一个完美示例是,当您拥有一个系统时,您不确切知道它将具有多少并发负载(例如,网络服务器)。此功能允许您指定一组核心线程,可能基于您的机器具有的核心数,但允许的负载超出您的预期。
如果您的I / O负载超出预期,并且池中的线程会花费大量时间阻塞,这将非常有用。在这种情况下,您的队列可以很容易地填满而不会产生大量并发负载,并且可以通过添加几个新线程来为一些更多的并发请求提供服务来轻松修复它。