提交依赖于其他任务的任务有死锁的风险,除非池是无界的

Submitting tasks that depend on other tasks risks deadlock unless the pool is unbounded

引自“Java 并发实践”第 8 章:

Mixing long-running and short-running tasks risks “clogging” the pool unless it is very large; submitting tasks that depend on other tasks risks deadlock unless the pool is unbounded.

为什么线程池很大,混合长运行和短运行任务避免“堵塞”池; 池是无界的意味着任务队列是无界的? 为什么线程池无界,提交依赖其他任务的任务避免死锁?

“Pool is unbounded”表示池中的线程数没有限制。

因此,可以并发执行的任务数量不受限制。

因此,您不会陷入执行任务 T1 依赖于任务 T2 的死锁,而任务 T2 由于没有可用线程而无法执行。


对于long-运行ning任务,可用线程数越少,所有线程被long-运行ning任务占用的风险就越大,没有线程剩余运行 个短任务。

池需要足够大以容纳长任务的峰值数量以及可能需要许多短任务来满足依赖性。有单独的游泳池似乎更好;更容易推理。