6

的文档ScheduledThreadPoolExecutor说 - 安排在完全相同的执行时间的任务以先进先出 (FIFO) 的提交顺序启用。

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

如果这是真的,那么我使用哪个类比哪个更好Timer,也没有这个 FIFO 问题?

4

3 回答 3

6

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

如果它找到一个任务,它会将它委托给池中的一个“工作”线程。

如果准备好执行多个任务,则它们一次“启动”一个,但根据 Java 的定义,一旦“启动”,后续处理是并发的。

如果您有两个任务都通过执行程序同时安排,则它们完成的顺序可能因运行而异,除非您放入特定的控件,例如锁定、等待等......来处理这个,这取决于 java 的线程调度(java 如何为内核上的线程分配时间)来确定如何以及何时处理什么。请注意,设置此类锁、等待等...是一项看似复杂的任务,容易出现竞争条件,导致意外死锁、活动锁等...

于 2013-03-11T19:03:41.827 回答
1

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

于 2013-03-11T18:56:34.917 回答
1

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

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

仅当您的活动任务多于池中的可用线程时,某些任务才必须等待。

于 2013-03-11T19:05:24.880 回答