ScheduledExecutorService的scheduleAtFixedRate和scheduleWithFixedDelay的区别
有时侯,自己只需要简单写代码就可以证实的东西,可以自己先实验下,避免部分不正确的言论误导自己
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) {
ScheduledExecutorService executorServiceRate = Executors.newSingleThreadScheduledExecutor();
ScheduledExecutorService executorServiceDelay = Executors.newScheduledThreadPool(2);
executorServiceRate.scheduleAtFixedRate(new Task("fixed-rate"), 0, 1, TimeUnit.SECONDS);
executorServiceDelay.scheduleWithFixedDelay(new Task("fixed-delay"), 0, 1, TimeUnit.SECONDS);
}
}
class Task implements Runnable {
private String name;
public Task(String name) {
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("name = " + name + ", now = " + new Date());
}
}
控制台输出
name = fixed-rate, now = Wed Nov 29 18:48:06 CST 2017
name = fixed-delay, now = Wed Nov 29 18:48:06 CST 2017
name = fixed-rate, now = Wed Nov 29 18:48:08 CST 2017
name = fixed-delay, now = Wed Nov 29 18:48:09 CST 2017
name = fixed-rate, now = Wed Nov 29 18:48:10 CST 2017
name = fixed-rate, now = Wed Nov 29 18:48:12 CST 2017
name = fixed-delay, now = Wed Nov 29 18:48:12 CST 2017
name = fixed-rate, now = Wed Nov 29 18:48:14 CST 2017
name = fixed-delay, now = Wed Nov 29 18:48:15 CST 2017
name = fixed-rate, now = Wed Nov 29 18:48:16 CST 2017
name = fixed-delay, now = Wed Nov 29 18:48:18 CST 2017
总结
- 无论是
scheduleAtFixedRate
还是scheduleWithFixedDelay
都会是在上一次任务执行完才执行(及同一个时间点,不会有2个task都在运行) - 区别在于, FixedRate 执行完后,如果已经到了(超过)下一个的执行时间点的情况,会直接执行,而FixedDelay,会顺着当前的时间点延到下一个周期再开始执行
Reproduced please indicate the author and the source, and error a link to this page.
text link:
/326.html