天天看點

原理暫且不談,定時器你當真會用?

SpingBoot的定時器我相信大家都會使用,即使不會使用的,随便搜尋一下,相信都能在30分鐘内上手.但是其實Spring的定時器有三種模式,分别是<code>fixedDelay</code>、<code>cron</code>、<code>fixedRate</code>.那這三種分别有什麼差別呢?我們來分别寫一個SpringBoot的定時器Demo來體驗一下.

fixedDelay方式

該方式最簡單,該方式的意思是,在上一個任務執行完成之後,間隔3秒(因為<code>@Scheduled(fixedDelay = 3 * 1000)</code>)後,執行下一個任務.這種是最容易了解的,是以放在第一個來講.用一個圖來表示的話,更容易了解.如下:

原理暫且不談,定時器你當真會用?

可以用輸出日志驗證上述結論

cron

因為上方代碼配置如下:

是以你可以了解為5s就是一個周期.這就相當于在宿舍洗澡,因為隻有一個洗澡位置(單線程),是以每次隻能進去一個人,然後舍長在門口,每5s看一下有沒有空位,有空位的話叫下一個進去洗澡.

第5秒的時候,舍長看了一下,發現第一個同學還沒有出來.

第二個周期,也就是第10秒的時候再看一下.發現已經有空位了,那麼就叫第二個同學進去洗.

第三個周期,也就是15秒的時候,又瞄了一眼,發現有空位了,叫第三個同學進去洗.

第四個周期,也就是20秒的時候,發現沒有空位.

第五個周期的時候,也就是25秒的時候.發現有空位了,接着叫下一個進去洗.剩下的不再分析.

用一張圖來表示如下:

fixedRate

還是要拿洗澡的這個例子來說.但是該方式和<code>cron</code>的方式有很大不同

因上方代碼配置如下:

你可以了解為舍長預算每個同學洗澡的時間是5秒,但是第一個同學進去洗澡,用了8秒.

第二個同學本來應該在第5秒的時候就進去的,結果第一個同學出來的時候,已經是第8秒了,那麼舍長就趕緊催第二個同學進去,把時間進度追回來.

第二個同學知道時間緊,洗了3秒就出來.此時舍長發現,第三個同學,原本應該是在第10秒進去的,結果現在已經到了第11秒(8+3),那麼就趕緊催第三個同學進去.

第三個同學沉醉其中,難以自拔的洗了6秒.出來的時候已經是第17秒(8+3+6).舍長掐指一算,發現第四個同學原本應該是第15秒的時候就進去了.結果現在都17秒了,時間不等人,催促第四個同學進去趕緊洗.

第四個同學隻洗了2秒就出來了,出來的時候,舍長看了一下時間,是第19秒.<code>"有原則"</code>的舍長發現,第5個同學原本預算是20秒的時候進去的,結果現在才19秒,不行,那讓他在外面玩1秒的手機,等20秒的時候再進去.

原理暫且不談,定時器你當真會用?