我有这个问题:
我有一个计时器。使用scheduleAtFixedRate,它会创建一个新的Timer任务。在该计时器任务中有某些代码,可能需要一段时间才能完成。如何在上一个任务尚未完成时确保Timer不会创建新任务?
由于
答案 0 :(得分:18)
我的回答是不使用Timer
,它已经过时了。自Java5起,Timer
已被ScheduledExecutorService
取代,后者更灵活,更易于使用。您可以更好地控制调度程序的工作方式,即Timer
无法实现的控制。
您使用Executors工厂类创建一个工厂类,该工厂类具有许多工厂方法。您应该关注的是newSingleThreadScheduledExecutor,它应该完全符合您的要求:
创建单线程执行程序 可以安排命令运行 在给定的延迟之后,或执行 定期。保证任务 顺序执行,不超过 任何给定的任务都将激活 时间。
使用ScheduledExecutorService
,而不是子类TimerTask
,直接将Runnable
子类化,然后将任务提交给执行程序。执行者有各种方法,你需要选择哪一种方法适合你的需要(仔细阅读ScheduledExecutorService
的javadoc),但要点是这样的:
// initialise the executor
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
while (tasksRemaining) {
// create your task
Runnable task = ....;
// submit it to the executor, using one of the various scheduleXYZ methods
executor.schedule(task, delay, unit);
}
// when everything is finished, shutdown the executor
executor.shutdown();
与往常一样,阅读javadoc。
答案 1 :(得分:3)
对应每个Timer对象 一个单一的后台线程 用于执行所有计时器 任务,顺序。计时器任务 应该快点完成。如果是计时器 任务需要很长时间才能完成, 它“占用”计时器的任务执行 线。反过来,这可以延迟 执行后续任务,其中 可以“束缚”并迅速执行 当(以及如果)冒犯时继承 任务终于完成了。
表示只有一个后台主题。所以我相信这种情况不会发生。