invokeAll的参数(集合)是否依赖于队列大小?

时间:2016-05-09 09:08:50

标签: java

据我所知,我可以向invokeAll提交一组可调用线程,而threadpool将执行所有任务(在任何给定点并行运行任务等于线程池大小)。

但是当我使用invokeall时,我真的需要处理队列溢出吗?

1 个答案:

答案 0 :(得分:2)

这完全取决于您的代码和业务要求。 javadoc for ThreadPoolExecutor说明了与队列有关的以下用例:

  

排队有三种常规策略:

     

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

     

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

     

有界队列。有界   queue(例如,ArrayBlockingQueue)有助于防止资源   与有限maximumPoolSizes一起使用时耗尽,但可以更多   很难调整和控制。队列大小和最大池大小可以   彼此交易:使用大型队列和小型池   最小化CPU使用率,OS资源和上下文切换开销,但是   可能导致人为的低吞吐量。如果任务经常阻止   (例如,如果它们是I / O绑定的),系统可能能够安排   比你允许的更多线程的时间。使用小队列   通常需要更大的池大小,这可以使CPU更加繁忙但可能   遇到不可接受的调度开销,这也会减少   吞吐量。