ScheduledThreadPoolExecutor可以同时执行多个任务吗?

时间:2013-03-11 18:53:49

标签: java scheduled-tasks

ScheduledThreadPoolExecutor的文档说 - 按照先进先出(FIFO)提交顺序启用计划完全相同执行时间的任务。

这是否意味着应该同时完成的任务永远不会同时完成。相反,它们是按FIFO顺序执行的?

如果确实如此,那么我使用哪个类比Timer好,并且没有这个FIFO问题?

3 个答案:

答案 0 :(得分:4)

ScheduledThreadPoolExecutor的工作方式是有一个“调度”或主线程来检查要执行的任务。

如果找到任务,它会将其委托给池中的“worker”线程。

如果准备好执行多个任务,它们会一次“启动”,尽管一旦“启动”,后续处理是并发的,符合Java的定义。

如果你有两个任务都是通过执行程序同时安排的,那么它们的完成顺序可能因运行而异,除非你输入特定的控件,如锁,等等......处理这个问题,取决于java的线程调度(java如何分配核心上的线程)来确定处理的方式和时间。请注意,设置这样的锁,等等......是一个看似复杂的任务,容易出现竞争条件导致意外死锁,活锁等...

答案 1 :(得分:1)

这取决于线程池的大小。如果您计划在午夜启动1000个任务,并且您只有25个线程,那么最初只能执行25个,而其余的必须等待可用线程。 FIFO在这里指的是执行程序将任务交给执行线程的顺序。

答案 2 :(得分:1)

请注意,文档谈论“启用”任务,而我们正在谈论线程池执行程序。 :-)

这意味着任务将等到指定的时间,然后将它们视为放入正常的ThreadPoolExecutor。如果池中有足够的可用线程,则所有这些任务将并行运行。

只有当您有更多任务变为活动而不是池中的可用线程时,某些任务才必须等待。