當前位置:網站首頁>ScheduledExecutorService scheduleAtFixedRate、scheduleWithFixedDelay以及創建定時心跳

ScheduledExecutorService scheduleAtFixedRate、scheduleWithFixedDelay以及創建定時心跳

2022-01-27 01:42:48 skyline_wx

scheduleAtFixedRate

scheduleAtFixedRate按固定的周期調度,api如下

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
                                              long initialDelay,
                                              long period,
                                              TimeUnit unit);

測試代碼如下:

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleAtFixedRate(()->{
    
     logger.info("==============");
     try {
    
         TimeUnit.SECONDS.sleep(2);
     } catch (InterruptedException e) {
    
         e.printStackTrace();
     }
 }, 1, 1, TimeUnit.SECONDS);

從代碼中可以看出來被調度的runnable每次都會sleep 2秒,但是scheduledExecutorService設置的是1秒調度一次,接下來我們看下執行結果:
scheduleAtFixedRate
從結果中可以看到,程序並不是1秒打印一次,而是2秒打印一次,是因為scheduleAtFixedRate中的period的時長是從runnable剛開始執行時算起的,如果在runnable執行完畢之後,時長不足period,那麼則等足period再執行調度,如果已經超出period,那麼馬上開啟下一次調度

scheduleWithFixedDelay

scheduleWithFixedDelay按固定的延遲調度,api如下

public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                 long initialDelay,
                                                 long delay,
                                                 TimeUnit unit);

測試代碼如下:

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleWithFixedDelay(()->{
    
     logger.info("==============");
     try {
    
         TimeUnit.SECONDS.sleep(2);
     } catch (InterruptedException e) {
    
         e.printStackTrace();
     }
 }, 1, 1, TimeUnit.SECONDS);

從代碼中可以看到runnable每次sleep 2秒,scheduledExecutorService設定的是每次延遲1秒執行,接下來我們看下執行的效果:
scheduleWithFixedDelay
從結果中可以看到,每隔3秒日志打印了一次,是因為delay的計算是從runnable執行的結束開始計算的,所以是這次的runnable執行完畢之後,開始等待delay再執行調度。

創建定時心跳

通過ScheduledExecutorService我們可以嘗試創建一個心跳測試器,代碼如下:

/** * heartBeatTest */
@Test
public void test3(){
    
    ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
    //延遲2秒調用
    scheduledExecutorService.schedule(()->{
    
        doHeartTest(scheduledExecutorService);
    }, 2, TimeUnit.SECONDS);
    //為了看效果
    try {
    
        TimeUnit.SECONDS.sleep(100);
    } catch (InterruptedException e) {
    
        e.printStackTrace();
    }
}

/** * 心跳測試 * @param scheduledExecutorService */
private void doHeartTest(ScheduledExecutorService scheduledExecutorService){
    
    //測試心跳
    logger.info("心跳測試==========");
    //放入一個任務,下一個2秒再做一次測試
    scheduledExecutorService.schedule(()->{
    
        doHeartTest(scheduledExecutorService);
    }, 2, TimeUnit.SECONDS);
}

執行結果如下:
heartBeatTest
可以看到每隔2秒程序就做了一次心跳測試。

版權聲明
本文為[skyline_wx]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201270142476733.html

隨機推薦