簡體   English   中英

Java 每 30 秒運行一次方法

[英]Java Run Method every 30th second of a minute

我有以下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 class 可能會有所幫助。

如果您閱讀Timer / TimerTask的 Javadoc,您將了解到這些類在幾年前被 Java 5 中的 Executors 框架取代。

使用ScheduledExecutorService安排任務在您指定的初始延遲后運行。 在初始延遲之后,指定一分鍾的重復周期。

然后,您的任務將在每分鍾的第 30 秒重復。 知道這個調度是近似的。 主機操作系統、JVM 的內部調度程序和垃圾收集都會影響任務實際運行的時間。 所以每次運行可能會有所不同。

或者,如果您想防止政客對您所在地區的計時異常施加任何影響,請僅安排一次計划任務而不是重復任務。 將對ScheduledExecutorService object 的引用傳遞給該任務。 然后,該任務可以在再次運行初始延遲計算后安排自己的下一次運行。

請務必最終關閉您的執行程序服務。 否則它的后備線程池可能會在你的應用程序結束后繼續無限期地運行,就像僵屍♂️。

請注意,任何異常或錯誤冒泡到計划的執行器服務將靜默停止任何進一步的計划。

所有這些主題已經在 Stack Overflow 上討論過很多次。 搜索以了解更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM