【发布时间】:2015-02-08 03:19:52
【问题描述】:
我的程序中有一个计划任务,它在给定时间段后关闭一个框架。但是,在任务执行后,程序继续运行,就好像 ScheduledExecutorService 仍在另一个线程上运行一样。
这是我的代码的相关部分:
int delay = 1000;
ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
ex.schedule(() -> {
System.out.println("executed");
getWindow().closeWindow();
// ex.shutdown();
}, delay, TimeUnit.MILLISECONDS);
这里任务在 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);
}
}
lambdas 可能已经放弃了它,但这确实是 Java 8。
为什么任务执行后程序没有停止?
【问题讨论】:
-
你应该在提交所有任务后调用
shutdown(),而不是shutdownNow()。这是根据ExecutorSErvice API。 -
@HovercraftFullOfEels 啊,是的,我知道。不过,这无关紧要。不用管它:)我会在那里编辑它anyhoo~
-
但
shutdown()调用并非无关,您的代码需要它。 -
@HovercraftFullOfEels 这无关紧要。这是一个很好的观点,但这不是我要问的。我在问为什么程序不会不调用
shutdown方法结束 -
但它非常相关。再次,请阅读我提供给您的 API 链接以了解原因。这是您的全部问题的全部答案。
标签: java multithreading scheduled-tasks java-8 scheduledexecutorservice