【问题标题】:How to implement a timer executing in exact time?如何实现在准确时间执行的计时器?
【发布时间】:2020-11-18 17:06:49
【问题描述】:

我想每小时执行一个任务,但发现Timer只能设置周期。

我的要求是:

  1. 当我启动计时器时,任务将立即执行。
  2. 每小时运行一次。如果我在 1:20 启动程序,它将立即执行。下次执行时间是 2:00。接下来是 3:00,以此类推。
  3. 如果我在 1:20 开始程序,并且在 2:00 没有完成任务,那么 2:00 的任务将被延迟。 1:20的任务完成后,立即执行2:00的任务。

我认为 JDK 的 Timer 只提供 2 个任务之间的时间段。如果我在 1:20 启动程序,第二个只能在 2:20 执行,第三个只能在 3:20 执行。所以我不知道如何实现自定义计时器。

【问题讨论】:

  • 到目前为止你做了什么,你面临的问题是什么。看看下面的提示。 stackoverflow.com/questions/7814089/…
  • 我使用 Timer.schedule() 方法并将周期设置为 1 小时。如果任务在 1:20 开始,下一个任务将在 2:20 开始,而不是 2:00。第三场将在 3:20 而不是 3:00 开始。

标签: java timer


【解决方案1】:

以下代码将在每小时开始时执行。

 Calendar calendar = Calendar.getInstance();
 ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
 scheduler.scheduleAtFixedRate(new YourTask(), millisToNextHour(calendar), 60*60*1000, TimeUnit.MILLISECONDS);

 private static long millisToNextHour(Calendar calendar) {
        int minutes = calendar.get(Calendar.MINUTE);
        int seconds = calendar.get(Calendar.SECOND);
        int millis = calendar.get(Calendar.MILLISECOND);
        int minutesToNextHour = 60 - minutes;
        int secondsToNextHour = 60 - seconds;
        int millisToNextHour = 1000 - millis;
        return minutesToNextHour*60*1000 + secondsToNextHour*1000 + millisToNextHour;
    }

你第一次可以像new YourTask().start();或任何其他适合你要求的方式做某事。

【讨论】:

  • 如果我第一次开始我的任务,但它在一个小时内没有完成,第二个任务将立即执行。它不会等待第一个。因为它们不是由一个 Timer 执行的。
  • 这就是为什么我要求使用适合您要求的任何东西。
猜你喜欢
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 2012-05-04
  • 2022-01-16
  • 2023-03-12
相关资源
最近更新 更多