JavaRunMethod每30秒一分钟
我有以下 while 循环:
while (keepRunning) {
if (!once) {
// Run a test method every 30th second
// Run the new calculations from the database
new CalculatorDriver().run();
// Wait in the while loop for 1 second before looping again
TimeUnit.SECONDS.sleep(1);
}
}
这个while循环将每秒循环一次代码,但现在我想运行一个名为:getNewCalculations()每30秒一分钟的方法,例如,该方法需要在以下位置运行:
- 18:26:30
- 18:27:30
- 18:28:30
我已经找到了一种每 x 秒运行一个方法的方法:
Timer timer = new Timer();
timer.schedule(new Task(), 60 * 1000);
但我也需要在特定点开始它。在 C# 中,有人尝试每隔 30 秒和每 0 秒运行一个脚本:https : //stackoverflow.com/a/53846390/10673107。
我可以if在第二个不能等于 0的地方添加一个,但我想知道是否有更好的方法来做到这一点。
我怎么能只在第 30 秒运行它?
回答
通过计算等待下一个 30 秒到达的秒数来设置初始延迟。如果当前时刻是 :10,则等待 20 秒。如果当前时刻是 :56,则等待 34 秒。
Duration课堂和ZonedDateTime课堂一起可能会对此有所帮助。
如果您阅读Timer/的 Javadoc,TimerTask您将了解到这些类在几年前被 Java 5 中的 Executors 框架所取代。
使用 aScheduledExecutorService安排任务在您指定的初始延迟后运行。在初始延迟之后,指定一分钟的重复周期。
然后您的任务将在每分钟的第 30 秒处重复。知道这个调度是近似的。主机操作系统、JVM 的内部调度程序和垃圾收集都会在任务实际运行时产生影响。所以每次运行可能会有所不同。
或者,如果您想防止政治家对您所在地区的计时造成任何异常,请仅安排一次性计划任务而不是重复任务。将对该ScheduledExecutorService对象的引用传递给该任务。然后,在再次运行初始延迟计算后,任务可以安排自己的下一次运行。
确保最终关闭您的执行程序服务。否则,即使在您的应用程序结束后,它的后备线程池可能会继续无限期地运行,就像一个僵尸???。
请注意,任何异常或错误冒泡到已调度的执行程序服务都将静默地停止任何进一步的调度。
Stack Overflow 上已经多次讨论了所有这些主题。搜索以了解更多信息。