繁体   English   中英

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

[英]Java: Timer and thread it creates

我有这个问题:

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

谢谢

我的答案是不使用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。

Timer类的doc

对应于每个Timer对象的是一个后台线程,用于按顺序执行所有计时器的任务。 计时器任务应该快速完成。 如果计时器任务花费过多时间来完成,它会“占用”计时器的任务执行线程。 反过来,这可以延迟后续任务的执行,后续任务可以在紧急任务最终完成时(以及如果)快速连续地“聚集”并执行。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM