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

时间:2018-01-08 22:54:46

标签: java concurrency java.util.concurrent threadpoolexecutor

在ThreadPoolExecutor类的Oracle文档中,编写了:

  

排队有三种常规策略:

     

直接切换。工作队列的一个很好的默认选择是手上的SynchronousQueue   将任务交给线程而不另外持有它们。在这里,一次尝试   如果没有可立即使用的线程,则排队任务将失败   运行它,所以将构造一个新的线程。 此政策可避免   处理可能具有内部的请求集时的锁定   依赖性。直接切换通常需要无限制   maximumPoolSizes以避免拒绝新提交的任务。这个   转向承认命令时无限制线程增长的可能性   继续平均到达的速度超过了它们的处理速度。

     

无界队列。使用无界队列(例如没有预定义容量的LinkedBlockingQueue)将导致新的   当所有corePoolSize线程都忙时,在队列中等待的任务。   因此,只会创建corePoolSize线程。 (而且   因此,maximumPoolSize的值没有任何影响。)这个   当每项任务完全独立于其他任务时,可能是适当的,   所以任务不会影响彼此的执行; 例如,在网络中   页面服务器。虽然这种排队方式在平滑方面很有用   在短暂的突发请求中,它承认了这种可能性   命令继续到达时无限制的工作队列增长   平均速度比处理速度快。   ...

与无界队列策略相比,为什么直接切换策略更能避免锁定?或者我不正确地理解它?

1 个答案:

答案 0 :(得分:1)

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

但是,如果任务是完全独立的,则没有理由在防止锁定方面使用直接切换。

这只是一个例子,internal dependency可能意味着很多不同的事情。