Java 如何实现计时器在精确时间内执行?

Java 如何实现计时器在精确时间内执行?,java,timer,Java,Timer,我想每小时执行一个任务,但我发现计时器只能设置周期 我的要求是: 当我启动计时器时,任务将立即执行 每小时跑一次。如果我在1:20启动程序,它将立即执行。下一次执行的时间是2:00。接下来是3点,以此类推 如果我在1:20启动程序,而任务在2:00未找到,则2:00的任务将延迟。当1:20的任务完成时,2:00的任务将立即执行 我认为JDK的计时器只提供两个任务之间的时间间隔。如果我在1:20启动程序,第二个只能在2:20执行,第三个只能在3:20执行。所以我不知道如何实现自定义计时器。以下代码

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

我的要求是:

  • 当我启动计时器时,任务将立即执行
  • 每小时跑一次。如果我在1:20启动程序,它将立即执行。下一次执行的时间是2:00。接下来是3点,以此类推
  • 如果我在1:20启动程序,而任务在2:00未找到,则2:00的任务将延迟。当1:20的任务完成时,2:00的任务将立即执行

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

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

     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;
        }
    

    这是你第一次可以做一些事情,比如
    newyourtask().start()或任何适合您的要求的其他方式。

    到目前为止您做了什么,您面临的问题是什么。看看下面的提示。我使用Timer.schedule()方法并将周期设置为1小时。如果任务在1:20开始,下一个任务将在2:20开始,而不是2:00。第三个任务将在3:20而不是3:00开始。如果我第一次启动任务,但在一小时内未完成,则第二个任务将立即执行。它不会等待第一个。因为它们不是由一个计时器执行的。这就是为什么我要求使用适合您要求的任何东西。