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执行。所以我不知道如何实现自定义计时器。以下代码
我认为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开始。如果我第一次启动任务,但在一小时内未完成,则第二个任务将立即执行。它不会等待第一个。因为它们不是由一个计时器执行的。这就是为什么我要求使用适合您要求的任何东西。