ThreadPoolExecutor javadoc,排队和锁定的三种策略

ThreadPoolExecutor javadoc,排队和锁定的三种策略,java,concurrency,java.util.concurrent,threadpoolexecutor,Java,Concurrency,Java.util.concurrent,Threadpoolexecutor,在ThreadPoolExecutor类的Oracle文档中,它是这样写的: 排队的一般策略有三种: 直接切换。对于工作队列来说,一个很好的默认选择是同步切换队列 将任务转移到线程,而不保留它们。这是一次尝试 如果没有线程可立即用于任务队列,则任务队列将失败 运行它,将构造一个新线程此策略避免 处理可能具有内部权限的请求集时发生锁定 依赖项。直接切换通常需要无限的 最大化工具大小以避免拒绝新提交的任务。这个 turn允许在执行命令时出现无限线程增长的可能性 继续以平均比处理速度更快的速度到达 无

在ThreadPoolExecutor类的Oracle文档中,它是这样写的:

排队的一般策略有三种:

直接切换。对于工作队列来说,一个很好的默认选择是同步切换队列 将任务转移到线程,而不保留它们。这是一次尝试 如果没有线程可立即用于任务队列,则任务队列将失败 运行它,将构造一个新线程此策略避免 处理可能具有内部权限的请求集时发生锁定 依赖项。直接切换通常需要无限的 最大化工具大小以避免拒绝新提交的任务。这个 turn允许在执行命令时出现无限线程增长的可能性 继续以平均比处理速度更快的速度到达

无界队列。使用无界队列(例如,没有预定义容量的LinkedBlockingQueue)将导致新的 当所有corePoolSize线程都忙时,要在队列中等待的任务。 因此,创建的线程不会超过corePoolSize。(及 因此,maximumPoolSize的值没有任何影响。) 当每项任务完全独立于其他任务时, 因此任务之间不能相互影响执行例如,在web中 页面服务器。而这种排队方式在平滑方面很有用 在短暂的突发请求之外,它承认 命令继续到达时的无限工作队列增长 平均速度比处理速度快。


为什么直接切换策略比无界队列策略更能避免锁定?还是我理解不正确?

假设您有一个
corePoolSize=1
。如果第一个任务将另一个任务提交到同一个池并等待结果,它将无限期锁定

但是,如果任务完全独立,就没有理由使用直接切换来防止锁定


这只是一个例子,
内部依赖
可能意味着很多不同的事情。

谢谢你的回答。尽管如此,正如我所看到的,有很多直接切换锁定的可能性。好的,我假设这是Oracle开发人员的某种“修辞”,其中没有多少。@vziminov区别在于,如果池中完全充满了锁定的任务(corePoolSize),它将永远无法接收更多的任务。这完全取决于您的用例。一般来说,如果并发线程受cpu限制,我不希望运行太多的并发线程,因此如果可能的话,
无界队列
将是我的选择