gpt4 book ai didi

Java 每 30 秒运行一次方法

转载 作者:行者123 更新时间:2023-12-02 16:13:09 25 4
gpt4 key购买 nike

我有以下 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 .

我可以在第二个不能等于 0 的地方添加一个 if,但我想知道是否有更好的方法来做到这一点。

如何只在第 30 秒运行它?

最佳答案

通过计算等待下一个 30 秒到达的秒数来设置初始延迟。如果当前时刻是 :10,则等待 20 秒。如果当前时间是 :56,则等待 34 秒。

Duration class 和 ZonedDateTime 可能会有所帮助类。

如果您阅读 Timer/TimerTask 的 Javadoc,您将了解到这些类在多年前已被 Java 5 中的 Executors 框架所取代。

使用 ScheduledExecutorService 安排任务在您指定的初始延迟后运行。在初始延迟后,指定一分钟的重复周期。

您的任务将在每分钟的第 30 秒标记处重复。知道这个调度是近似的。主机操作系统、JVM 的内部调度程序和垃圾收集都会在任务实际运行时产生影响。因此每次运行可能会有所不同。

或者,如果您想防止政客强加给您所在地区的计时异常,请仅安排一次性计划任务,而不是重复任务。将对 ScheduledExecutorService 对象的引用传递给该任务。然后,任务可以在再次运行初始延迟计算后安排自己的下一次运行。

请务必最终关闭您的执行程序服务。否则,即使在您的应用程序结束后,它的后台线程池也可能会继续无限期运行,就像僵尸🧟‍♂️。

请注意,任何冒泡到计划执行程序服务的异常或错误都将静默停止任何进一步的计划。

所有这些主题都已在 Stack Overflow 上多次讨论过。 Search to learn more .

关于Java 每 30 秒运行一次方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67490810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com