ScheduledExecutorService - 程序在一次性操作后不会结束

Ola*_*oja 4 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);
Run Code Online (Sandbox Code Playgroud)

这里任务在1秒延迟后执行,"执行"打印一次,帧关闭,程序即使在此代码之后也继续运行.如果我取消注释ex.shutdownNow();,程序将按预期成功结束.但是,我无法弄清楚为什么会这样.我也没能从互联网的其他部分找到任何东西.

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

}
Run Code Online (Sandbox Code Playgroud)

lambdas可能已经放弃了,但这确实是Java 8.

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

Sot*_*lis 9

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

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

做你发现并关闭它.请注意,您应该将其永远关闭在安全的地方,操作不会失败.