首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ScheduledExecutorService -在一击操作后不结束的程序

ScheduledExecutorService -在一击操作后不结束的程序
EN

Stack Overflow用户
提问于 2014-12-10 02:29:55
回答 5查看 6.7K关注 0票数 6

我在我的程序中有一个预定的任务,它在给定的时间之后关闭一个框架。但是,在任务执行之后,程序继续运行,就好像ScheduledExecutorService仍然运行在不同的线程上一样。

这是我代码的相关部分:

代码语言:javascript
运行
复制
int delay = 1000;

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
ex.schedule(() -> {

    System.out.println("executed");
    getWindow().closeWindow();
    // ex.shutdown();

}, delay, TimeUnit.MILLISECONDS);

在这里,任务在1秒延迟后执行,“执行”被打印一次,框架关闭,程序甚至在这段代码之后继续运行。如果我取消对ex.shutdownNow();的注释,程序就会成功地按预期结束。不过,我不明白为何会出现这种情况。我也没有从其他互联网上找到任何东西。

MCVE:

代码语言:javascript
运行
复制
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Main {

    public static void main(String[] args) {
        int delay = 1000;

        ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
        ex.schedule(() -> {

            System.out.println("executed");
            // ex.shutdown();

        }, delay, TimeUnit.MILLISECONDS);
    }

}

lambdas可能已经分发了它,但这确实是Java 8。

为什么程序在任务执行之后不停止?

EN

Stack Overflow用户

回答已采纳

发布于 2014-12-10 02:35:48

ScheduledExecutorService返回的Executors#newSingleThreadScheduledExecutor()线程池使用非守护进程线程。在关闭线程池之前,这些线程池仍在等待任务。当非守护进程线程处于活动状态时,JVM不会结束。

您可以使用重载的Executors#newSingleThreadScheduledExecutor(ThreadFactory)并提供自己的ThreadFactory实现,这将创建守护进程线程。请注意,这可能会导致您的任务甚至无法运行,因为JVM将在任务预定时间之前退出。

照你发现的做然后关闭它。请注意,您应该始终在安全的地方关闭它,在那里操作不会失败。

票数 14
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27392389

复制
相关文章

相似问题

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