在ThreadPoolExecutor类的Oracle文档中,编写了:
排队有三种常规策略:
直接切换。工作队列的一个很好的默认选择是手上的SynchronousQueue 将任务交给线程而不另外持有它们。在这里,一次尝试 如果没有可立即使用的线程,则排队任务将失败 运行它,所以将构造一个新的线程。 此政策可避免 处理可能具有内部的请求集时的锁定 依赖性。直接切换通常需要无限制 maximumPoolSizes以避免拒绝新提交的任务。这个 转向承认命令时无限制线程增长的可能性 继续平均到达的速度超过了它们的处理速度。
无界队列。使用无界队列(例如没有预定义容量的LinkedBlockingQueue)将导致新的 当所有corePoolSize线程都忙时,在队列中等待的任务。 因此,只会创建corePoolSize线程。 (而且 因此,maximumPoolSize的值没有任何影响。)这个 当每项任务完全独立于其他任务时,可能是适当的, 所以任务不会影响彼此的执行; 例如,在网络中 页面服务器。虽然这种排队方式在平滑方面很有用 在短暂的突发请求中,它承认了这种可能性 命令继续到达时无限制的工作队列增长 平均速度比处理速度快。 ...
与无界队列策略相比,为什么直接切换策略更能避免锁定?或者我不正确地理解它?
答案 0 :(得分:1)
假设你有corePoolSize = 1
。如果第一个任务将另一个任务提交到同一个池并等待结果,它将无限期地锁定。
但是,如果任务是完全独立的,则没有理由在防止锁定方面使用直接切换。
这只是一个例子,internal dependency
可能意味着很多不同的事情。