Java定時任務schedule和scheduleAtFixedRate的異同

一、使用

相同點

  • 任務執行未超時,則下次執行時間 = 上次執行開始時間 + period
  • 任務執行超時,則下次執行時間 = 上次執行結束時間

不同點

  • schedule在錯過以後會按照自己的節奏繼續走,可能會導致丟失任務,但時間間隔穩定。
  • scheduleAtFixedRate在錯過後,會努力追趕進度,以確保保持執行頻率的穩定。

代碼示例

我們進行一個簡單的測試,在下面的代碼中,每3秒就會有一個間隔5秒的線程休眠(模擬超時),對比一下二者輸出數據的區別。

package com;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
    public static void main(String[] args) {
        // 任務此時已經啟動
        Timer t = new Timer();
        TimerTask task = new CustomTimerTask("test");
        // 添加任務
        /*
         * schedule 保持間隔時間的穩定
         * scheduleAtFixedRate 保持執行頻率的穩定
         */
        t.schedule(task, new Date(), 2000);
//        t.scheduleAtFixedRate(task, new Date(), 2000);
    }
}
class CustomTimerTask extends TimerTask {
    private String name;
    int count = 1;
    private final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public CustomTimerTask(String name) {
        this.name = name;
    }
    @Override
    public void run() {
        try {
            System.out.println("線程 : " + count);
            System.out.println("startTime = " + dateFormatter.format(new Date()));
            if (count % 3 == 0) {
                Thread.sleep(5000);
            }
            count++;
            System.out.println("endTime = " + dateFormatter.format(new Date()) + "\r\n");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 輸出數據對比

schedule

線程 : 1
startTime = 2023-02-25 10:20:28
endTime = 2023-02-25 10:20:28

線程 : 2
startTime = 2023-02-25 10:20:30
endTime = 2023-02-25 10:20:30

線程 : 3
startTime = 2023-02-25 10:20:32
endTime = 2023-02-25 10:20:37

線程 : 4
startTime = 2023-02-25 10:20:37
endTime = 2023-02-25 10:20:37

線程 : 5
startTime = 2023-02-25 10:20:39
endTime = 2023-02-25 10:20:39

線程 : 6
startTime = 2023-02-25 10:20:41
endTime = 2023-02-25 10:20:46

線程 : 7
startTime = 2023-02-25 10:20:46
endTime = 2023-02-25 10:20:46

線程 : 8
startTime = 2023-02-25 10:20:48
endTime = 2023-02-25 10:20:48

線程 : 9
startTime = 2023-02-25 10:20:50
endTime = 2023-02-25 10:20:55

線程 : 10
startTime = 2023-02-25 10:20:55
endTime = 2023-02-25 10:20:55

線程 : 11
startTime = 2023-02-25 10:20:57
endTime = 2023-02-25 10:20:57

可以看到,schedule在線程4的位置,它的開始時間是上一個線程的結束時間,它有在努力追趕,但後續並沒有把之前落下的線程補回來。

scheduleAtFixedRate

線程 : 1
startTime = 2023-02-25 10:18:59
endTime = 2023-02-25 10:18:59

線程 : 2
startTime = 2023-02-25 10:19:01
endTime = 2023-02-25 10:19:01

線程 : 3
startTime = 2023-02-25 10:19:03
endTime = 2023-02-25 10:19:08

線程 : 4
startTime = 2023-02-25 10:19:08
endTime = 2023-02-25 10:19:08

線程 : 5
startTime = 2023-02-25 10:19:08
endTime = 2023-02-25 10:19:08

線程 : 6
startTime = 2023-02-25 10:19:09
endTime = 2023-02-25 10:19:14

線程 : 7
startTime = 2023-02-25 10:19:14
endTime = 2023-02-25 10:19:14

線程 : 8
startTime = 2023-02-25 10:19:14
endTime = 2023-02-25 10:19:14

線程 : 9
startTime = 2023-02-25 10:19:15
endTime = 2023-02-25 10:19:20

線程 : 10
startTime = 2023-02-25 10:19:20
endTime = 2023-02-25 10:19:20

線程 : 11
startTime = 2023-02-25 10:19:20
endTime = 2023-02-25 10:19:20

同樣是線程4的位置,它的開始時間是上一個線程的結束時間,並且在其後還有一個線程5,說明scheduleAtFixedRate還是在很努力地加油想把之前落下的線程補回來的。

到此這篇關於Java定時任務schedule和scheduleAtFixedRate的異同的文章就介紹到這瞭,更多相關Java schedule scheduleAtFixedRate內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: