java - ScheduledExecutorService - 程序在一次性操作后未结束

标签 java multithreading scheduled-tasks java-8 scheduledexecutorservice

我的程序中有一个计划任务,它会在给定时间段后关闭一个框架。但是,在任务执行后,程序继续运行,就好像 ScheduledExecutorService 仍在另一个线程上运行一样。

这是我代码的相关部分:

int delay = 1000;

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

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

}, delay, TimeUnit.MILLISECONDS);

这里的任务在延迟 1 秒后执行,打印一次“executed”,框架关闭,程序在这段代码之后继续运行。如果我取消注释 ex.shutdownNow();,程序会按预期成功结束。但是,我无法弄清楚为什么会这样。我也未能从 Internet 的其余部分找到任何内容。

MCVE:

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);
    }

}

lambda 表达式可能已经暴露了它,但这确实是 Java 8。

为什么任务执行完后程序没有停止?

最佳答案

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

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

按照您的发现进行操作并关闭它。请注意,您应该始终在安全的地方关闭它,操作不会失败。

关于java - ScheduledExecutorService - 程序在一次性操作后未结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27392389/

相关文章:

java - 无法在 Android 中的 FTP 服务器上上传文件

c++ - 在多线程程序中创建 OpenGL 结构?

c++ - 使用 Win32 线程模型时,MinGW-w64 是否支持开箱即用的 std::thread?

mysql - 错误代码 : 1044. 用户 'root' @'%' 访问数据库 'xxxxxxxABC' 被拒绝

windows - 您如何安排在 Windows XP 上运行每日脚本?

java - 如何初始化相互依赖的最终引用?

java - 我想检查 onClick 按钮事件的蓝牙状态。可以这样做吗?这是我的代码的一部分

Java 对象的泛型类型

c++ - 使用 zmq 进行多线程发布

xml - 任务计划程序 - 自定义事件过滤器触发器未触发操作