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秒调度一次,接下来我们看下执行结果:
从结果中可以看到,程序并不是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秒执行,接下来我们看下执行的效果:
从结果中可以看到,每隔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);
}
执行结果如下:
可以看到每隔2秒程序就做了一次心跳测试。