据我所知,我可以向invokeAll提交一组可调用线程,而threadpool将执行所有任务(在任何给定点并行运行任务等于线程池大小)。
但是当我使用invokeall时,我真的需要处理队列溢出吗?
答案 0 :(得分:2)
这完全取决于您的代码和业务要求。 javadoc for ThreadPoolExecutor说明了与队列有关的以下用例:
排队有三种常规策略:
直接切换。一个 工作队列的良好默认选择是交给的SynchronousQueue 将任务交给线程而不另外持有它们。在这里,一次尝试 如果没有可立即使用的线程,则排队任务将失败 运行它,所以将构造一个新的线程。这个政策避免了 处理可能具有内部的请求集时的锁定 依赖。直接切换通常需要无限制 maximumPoolSizes以避免拒绝新提交的任务。这个 转向承认命令时无限制线程增长的可能性 继续平均到达的速度超过了它们的处理速度。
无限队列。使用无界队列(例如a LinkedBlockingQueue没有预定义的容量)将导致新的 当所有corePoolSize线程都忙时,在队列中等待的任务。 因此,只会创建corePoolSize线程。 (而且 因此,maximumPoolSize的值没有任何影响。)这 当每项任务完全独立于其他任务时,可能是适当的, 所以任务不能影响彼此的执行;例如,在网络中 页面服务器。虽然这种排队方式在平滑方面很有用 在短暂的突发请求中,它承认了这种可能性 命令继续到达时无限制的工作队列增长 平均速度比处理速度快。
有界队列。有界 queue(例如,ArrayBlockingQueue)有助于防止资源 与有限maximumPoolSizes一起使用时耗尽,但可以更多 很难调整和控制。队列大小和最大池大小可以 彼此交易:使用大型队列和小型池 最小化CPU使用率,OS资源和上下文切换开销,但是 可能导致人为的低吞吐量。如果任务经常阻止 (例如,如果它们是I / O绑定的),系统可能能够安排 比你允许的更多线程的时间。使用小队列 通常需要更大的池大小,这可以使CPU更加繁忙但可能 遇到不可接受的调度开销,这也会减少 吞吐量。