這是代碼:爲什麼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