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!
推薦閱讀:
- Java 實現訂單未支付超時自動取消功能(京東商城為例)
- Java任務定時執行器案例的實現
- 深入瞭解Java定時器中的Timer的原理
- Java中的定時器Timer詳解
- Java中定時任務的6種實現方式