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.
为什么程序在任务执行后没有停止?
ScheduledExecutorService返回的线程池Executors#newSingleThreadScheduledExecutor()使用非守护程序线程.在关闭线程池之前,这些仍在等待任务.当非守护程序线程处于活动状态时,JVM不会结束.
您可以使用重载Executors#newSingleThreadScheduledExecutor(ThreadFactory)并提供自己的ThreadFactory实现来创建守护程序线程.请注意,这可能会导致您的任务甚至无法运行,因为JVM将在任务的预定时间之前退出.
做你发现并关闭它.请注意,您应该将其永远关闭在安全的地方,操作不会失败.
| 归档时间: |
|
| 查看次数: |
4300 次 |
| 最近记录: |