簡體   English   中英

如何在特定時間段內使用 ScheduledExecutorService 運行任務?

[英]How to run a task DURING PARTICULAR PERIOD OF TIME with ScheduledExecutorService?

我正在嘗試創建一個計划作業,每天從早上 7 點到下午 22 點每 5 分鍾運行一次。 例如,它應該在 7:00、7:05、7:10 ... 21:55 運行,然后它應該在 22:00 停止。 第二天,它再次運行相同的計划,依此類推。

我發現這個例子展示了如何使用ScheduledExecutorService在特定時間啟動任務。 如何使用 ScheduledExecutorService 每天在特定時間運行某些任務?

我參考了答案並編寫了如下代碼:(我使用的是 Java 7)

class Scheduler {
    private ScheduledExecutorService executors;

    public static void main(String[] arg) {
       Runnable task = new Runnable() {
            @Override
            public void run() {
                ...DO SOMETHING...
            }
       };
        
       // Get how many seconds before the next start time (7AM).
       long initDelay = getInitialDelay(7); 
       
       ScheduledExecutorService executors = Executors.newSingleThreadScheduledExecutor();
       executors.scheduleAtFixedRate(task, initDelay, (60 * 5), TimeUnit.SECONDS);
   }

    private static long getInitialDelay(int hour) {
        Calendar calNow = Calendar.getInstance();

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, hour);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);

        long diff = cal.getTimeInMillis() - calNow.getTimeInMillis();
        if (diff < 0) {
            cal.add(Calendar.DAY_OF_MONTH, 1);
            diff = cal.getTimeInMillis() - calNow.getTimeInMillis();
        }

        return diff / 1000;
    }
}

我上面的代碼從早上 7 點開始,每 5 分鍾完美運行一次。 但是,如何控制ScheduledExecuterService在下午 22 點停止任務,然后在第二天早上 7 點重新開始?

或者,有沒有更好的其他方法可以在每天的特定時間段內運行任務?

固定的預定執行程序服務不能改變其時間。

所以使用單次運行的非固定預定執行器服務。 調用ScheduledExecutorService::schedule 在第一次運行時,檢查當前時間。 如果在工作日結束之前,再次調用相同的方法schedule ,傳遞五分鍾的延遲。 如果在工作日結束后延遲八小時,即新工作日開始前的時間量。

所以,一個簡單的小技巧。 可運行的每次運行都會無休止地安排下一次運行。

暫無
暫無

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

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