我的程序中有一个计划任务,它会在给定时间段后关闭一个框架。但是,在任务执行后,程序继续运行,就好像 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/