首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何停止ScheduledExecutorService?

如何停止ScheduledExecutorService?
EN

Stack Overflow用户
提问于 2015-12-10 21:06:30
回答 1查看 34.3K关注 0票数 28

程序在打印9次后结束:

代码语言:javascript
复制
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秒的时间限制后没有停止?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-10 21:32:29

您遇到的问题是,在您取消beep任务之后,调度程序会保留一个活动线程。

如果存在活动的非守护进程线程,则JVM保持活动状态。

它保留这个线程的原因是,您已经在下面这行中告诉它这样做:

代码语言:javascript
复制
private final ScheduledExecutorService scheduler
        = Executors.newScheduledThreadPool(1);

请注意newScheduledThreadPool(int corePoolSize)的文档

corePoolSize -保留在池中的线程数,即使它们是空闲的。

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

  1. 0传递给newScheduledThreadPool,而不是1。调度器将不会保留活动线程,并且JVM将关闭调度器。你无论如何都应该这样做,以释放它的资源。因此,将您的匿名Runnable中的run更改为:

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

(实际上,您不需要cancel - shutdown将在下一次“嘟嘟声”结束时立即生效。)

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34202701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档