Java:它创建的计时器和线程

时间:2009-12-19 17:12:57

标签: java timer concurrency executorservice executor

我有这个问题:

我有一个计时器。使用scheduleAtFixedRate,它会创建一个新的Timer任务。在该计时器任务中有某些代码,可能需要一段时间才能完成。如何在上一个任务尚未完成时确保Timer不会创建新任务?

由于

2 个答案:

答案 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 class

的文档
  

对应每个Timer对象   一个单一的后台线程   用于执行所有计时器   任务,顺序。计时器任务   应该快点完成。如果是计时器   任务需要很长时间才能完成,   它“占用”计时器的任务执行   线。反过来,这可以延迟   执行后续任务,其中   可以“束缚”并迅速执行   当(以及如果)冒犯时继承   任务终于完成了。

表示只有一个后台主题。所以我相信这种情况不会发生。