1. 程式人生 > >java定時器Timer當執行時間大於間隔時間會怎樣

java定時器Timer當執行時間大於間隔時間會怎樣

如果你用的是 java.util.Timer,那麼這個Timer 有兩種執行模式:
fixed-rate:對應於 scheduleAtFixedRate 方法
fixed-delay:對應於 schedule 方法

fixed-rate 模式,如果某次任務超時了,它會智慧的縮短下一次任務的執行時間,
比如你 10 秒一次任務,但是任務執行了 15 秒,
那麼下一次任務如果沒有超時的話,可能也不會分配給他完整的 10 秒,而是 5 秒

目的是儘量讓後面的任務可以趕上來
任務執行時間可能是這樣一個模式:
第一次任務:15 秒(超時)
第二次任務:8 秒(未超時)
第三次任務:7 秒(未超時)
第四次任務:10 秒(未超時)
……

如果你任務一直都在超時,可能每次任務執行完之後,就會立刻執行下一次任務
其實如果你每次任務都超時,你應該考慮的是,
在程式中,就增加任務的延時

fixed-delay 模式,如果你某次任務超時了,也不會影響下一次任務的執行時間
10 秒週期的任務,執行了 15 秒
那下一次任務依然是分配完整的 10 秒
任務執行時間可能是這樣一個模式:
第一次任務:15 秒(超時)
第二次任務:10 秒(未超時)
第三次任務:10 秒(未超時)
第四次任務:15 秒(超時)

如果你用的是 javax.swing.Timer,這個是按固定週期觸發的
由於這個 Timer 是在 EDT (Java GUI 的事件指派執行緒)上執行的
EDT 有智慧合併任務的處理

如果你某次任務超時了,那麼下一次任務將和下下次任務智慧合併成一個任務
比如 10 秒週期的任務,執行了 15 秒
任務執行時間可能是這樣一個模式:
第一次任務:20 秒(超時)
第二次任務:合併
第三次任務:10 秒(未超時)
……

其實 javax.swing.Timer 也有 Fixed Rate 模式,
可以通過 setCoalesce(false); 方法開啟
但是不建議這樣使用