这是代码:为什么ScheduledExecutorService在15秒内关闭,但它仍然会执行第17和第20秒任务?
public class TimerTask {
private final ScheduledExecutorService scheduler;
private ScheduledFuture<?> scheduledFuture;
TimerTask() {
scheduler = Executors.newScheduledThreadPool(1);
}
private void startTimerTask() {
Runnable printTask = createPrintTask();
System.out.println(new Date());
scheduledFuture = scheduler.scheduleAtFixedRate(printTask, 5, 2, TimeUnit.SECONDS);
scheduler.schedule(() -> {
if (scheduledFuture != null && !scheduledFuture.isCancelled()) {
scheduledFuture.cancel(true);
System.out.println(new Date());
}
}, 10, TimeUnit.SECONDS);
scheduler.schedule(() -> {
if (scheduledFuture != null || scheduledFuture.isCancelled()) {
System.out.println(scheduledFuture.isDone() + " " + scheduledFuture.isCancelled());
scheduler.shutdown();
}
}, 15, TimeUnit.SECONDS);
scheduler.schedule(() -> {
if (scheduledFuture != null || scheduledFuture.isCancelled()) {
System.out.println("danluo");
}
}, 17, TimeUnit.SECONDS);
scheduledFuture = scheduler.scheduleAtFixedRate(printTask, 20, 2, TimeUnit.SECONDS);
}
private Runnable createPrintTask() {
return() -> System.out.println("nsnnsn" + new Date());
}
public static void main(String []args) {
TimerTask timerTask = new TimerTask();
timerTask.startTimerTask();
}
}
这是输出:
Wed May 24 10:39:06 CST 2017
nsnnsnWed May 24 10:39:11 CST 2017
nsnnsnWed May 24 10:39:13 CST 2017
nsnnsnWed May 24 10:39:15 CST 2017
Wed May 24 10:39:16 CST 2017
nsnnsnWed May 24 10:39:17 CST 2017
nsnnsnWed May 24 10:39:19 CST 2017
nsnnsnWed May 24 10:39:21 CST 2017
true true
danluo
为什么它会前17秒和15秒20执行第二个任务? 看起来很奇怪。你能帮我回答这个问题吗? 谢谢。
它表明代码太多了,我不知道为什么,所以我再补充一些解释。
是的,非常感谢,我已经明白了。 – danny