2017-05-24 21 views
0

这是代码:为什么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执行第二个任务? 看起来很奇怪。你能帮我回答这个问题吗? 谢谢。

它表明代码太多了,我不知道为什么,所以我再补充一些解释。

回答

0

当你说,

scheduler.schedule(() -> { 
    if (scheduledFuture != null || scheduledFuture.isCancelled()) { 
    System.out.println("danluo"); 
    } 
}, 17, TimeUnit.SECONDS); 

你可以像读它,如果scheduledFuture不是null它已经被取消这是没有逻辑意义。如果是null那么第二个测试会抛出一个空指针异常。因此,我只能断定你想

scheduler.schedule(() -> { 
    if (scheduledFuture != null && !scheduledFuture.isCancelled()) { 
    System.out.println("danluo"); 
    } 
}, 17, TimeUnit.SECONDS); 

其内容

如果scheduledFuturenull没有被取消。

因为当你已经结束了,你大概想继续做任务的任务。至于第二个scheduledFuture在20秒的间隔,当你说scheduledFuture = scheduler.scheduleAtFixedRate你创建一个新的...... jvm指出,你不再引用旧的scheduledFuture实例 - 但你有更多的一个,并且一个不是可达(给你)。为此使用新的参考名称。或者如果您需要安排多个任务,请拨打List或使用PriorityQueue

+0

是的,非常感谢,我已经明白了。 – danny

0

从为什么计划任务虽然ExecutorService的执行你的文章的标题回答的问题是,从JavaDoc中关机ExecutorService.shutdown()

发起在以前已提交任务的执行有序关闭,但是不新任务将被接受。如果已关闭,调用没有其他影响。

所以你的计划任务将运行,直到他们完成,只有然后ExecutorService本身将停止。

相关问题