ScheduledExecutorService scheduleAtFixedRate、scheduleWithFixedDelay以及创建定时心跳

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秒程序就做了一次心跳测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值