2017-06-03 31 views
2

我使用彈簧引導@Scheduled註釋與FIXEDDELAY以毫秒爲單位在Javadoc記載:彈簧@Scheduled計時器精度

以固定的週期執行的註釋的方法以毫秒爲單位的最後一個調用的端部之間和下一個的開始。

代碼:

@Scheduled(fixedDelay=1000) 
public void task() { 
    LOG.info("START: " + System.currentTimeInMillis()); 
    ....do some work here... 
    LOG.info("END: " + System.currentTimeInMillis()); 
} 

有時我得到這樣的輸出先前任務的結束和下一個任務之間的時間開始進行約2-30 milliseconds小於1000ms

這是正常的,由於一些粒度或爲什麼發生?有沒有關於這個三角洲價值的保證?

回答

1

有多種不同的方式可以使用@預定註釋。

按照documentation

固定利率調用方法每隔t毫秒但時間延遲從所述調用的開始測量的。如果t ms被傳遞並且該方法仍在執行中,那麼下一個調用將等待它結束,並在第一個調用之後立即調用。嘗試將Thread.sleep(3000)放入您的方法中。我認爲你的方法需要大約950毫秒才能完成。

如果您想在完成執行後等待,您可以使用fixedDelay

+0

是的,其實只是檢查,我用fixedDelay。將修復描述 –

+0

您是否也遇到了f​​ixedDelay問題? – chuckskull

+0

是的,我從一開始就使用了fixedDelay,只是在寫這篇文章時誤打錯了 –

0

顯然它不能保證,因爲你最有可能不在實時系統。根據目前CPU所做的工作,它可以像這樣變化。由於操作系統調度等原因,很難在大多數PC上執行這樣的操作(除非您直接訪問CPU/GPU,但即使如此)

0

@Scheduled(fixedDelay=1000)作品如何,它都會運行此方法無效每1000 ms(如果這個任務完成執行<1000 ms或這將異步運行)。如果>1000ms它執行任務將進入所使用的Executor服務中的任務隊列。有沒有連接任務結束,並開始下一個任務但連接開始任務和開始下一個任務

+0

有chuckskull已經提到的fixedDelay和fixedRate。而fixedDelay實際上是在上一個任務結束1000ms(在這種情況下)之後開始下一次執行 –