【发布时间】:2013-03-11 18:53:49
【问题描述】:
ScheduledThreadPoolExecutor 的文档说 -
按照先进先出 (FIFO) 提交的顺序启用安排在完全相同的执行时间的任务。
这是否意味着应该同时完成的任务永远不会同时完成。而是以先进先出的顺序执行?
如果是这样,那么我使用哪个类比Timer 更好,并且也没有这个 FIFO 问题?
【问题讨论】:
标签: java scheduled-tasks
ScheduledThreadPoolExecutor 的文档说 -
按照先进先出 (FIFO) 提交的顺序启用安排在完全相同的执行时间的任务。
这是否意味着应该同时完成的任务永远不会同时完成。而是以先进先出的顺序执行?
如果是这样,那么我使用哪个类比Timer 更好,并且也没有这个 FIFO 问题?
【问题讨论】:
标签: java scheduled-tasks
ScheduledThreadPoolExecutor 的工作方式是有一个“调度”或主线程来检查要执行的任务。
如果它找到一个任务,它会将其委托给池中的“工作”线程。
如果准备好执行多个任务,则一次“启动”一个,但根据 Java 的定义,一旦“启动”,后续处理是并发的。
如果您有两个任务都通过执行程序同时安排,则它们完成的顺序可能因运行而异,除非您设置特定的控件,例如锁定、等待等...处理这个问题,取决于 java 的线程调度(java 如何将时间分配给内核上的线程)来确定如何以及何时处理什么。请注意,设置此类锁、等待等...是一项看似复杂的任务,容易出现竞争条件,导致意外死锁、活动锁等...
【讨论】:
这取决于你的线程池的大小。如果您安排 1000 个任务在午夜触发,而您只有 25 个线程,那么最初只能执行 25 个,而其余的必须等待可用线程。这里的FIFO是指执行器将任务交给执行线程的顺序。
【讨论】:
请注意,文档谈论“启用”任务,而我们谈论的是 threadpool 执行器。 :-)
这意味着任务将等待到指定的时间,然后将它们视为放入普通的ThreadPoolExecutor中。如果池中有足够的线程可用,所有这些任务将并行运行。
只有当池中的活动任务多于可用线程时,才会有一些任务需要等待。
【讨论】: