当前位置:  开发笔记 > 编程语言 > 正文

如何停止ScheduledExecutorService?

如何解决《如何停止ScheduledExecutorService?》经验,为你挑选了1个好方法。

该程序在九次打印后完成:

class BeeperControl {

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public void beep() {
        final Runnable beeper = new Runnable() {
            public void run() {
                System.out.println("beep");
            }
        };
        final ScheduledFuture beeperHandle = scheduler.scheduleAtFixedRate(
                beeper, 1, 1, SECONDS);
        scheduler.schedule(new Runnable() {
            public void run() {
                beeperHandle.cancel(true);
            }
        }, 1 * 9, SECONDS);
    }

    public static void main(String[] args) {
        BeeperControl bc = new BeeperControl();
        bc.beep();
    }
}

如何停止进程(例如eclipse中的java进程),因为它在9秒内没有停止时间限制?



1> RealSkeptic..:

您遇到的问题是,在您取消蜂鸣声任务后,调度程序会保留一个实时线程.

如果存在实时非守护程序线程,则JVM保持活动状态.

保持这个线程的原因是你告诉它在这一行中这样做:

private final ScheduledExecutorService scheduler
        = Executors.newScheduledThreadPool(1);

请注意以下文档newScheduledThreadPool(int corePoolSize):

corePoolSize - 池中保留的线程数,即使它们处于空闲状态.

因此,您有两种可能的方法来使JVM终止:

    传递0newScheduledThreadPool而不是1.调度程序不会保留活动线程,JVM将终止.

    关闭调度程序.无论如何,你应该这样做才能释放它的资源.因此,将run您的匿名内容更改Runnable为:

    public void run() {
        beeperHandle.cancel(true);
        scheduler.shutdown();
    }
    

(事实上​​,你不需要cancel那里 - shutdown一旦完成下一个"嘟嘟"声就会生效.)

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有