And*_*ono 7 java multithreading
我只是偶然发现了守护程序线程的奇怪行为,我无法解释.我已将代码缩减为最小,完整且可验证的样本:
public static void main(String[] args) throws InterruptedException {
Thread runner = new Thread(() -> {
final int SIZE = 350_000;
for (int i = 0; i < SIZE; i++) {
for (int j = i + 1; j < SIZE; j++) {
if (i*j == SIZE * SIZE - 1) {
return;
}
}
}
});
runner.setDaemon(true);
runner.start();
// Thread.sleep(1000);
System.out.println("Exiting.");
}
Run Code Online (Sandbox Code Playgroud)
runner线程执行的代码大约需要12秒才能在我的盒子上终止,我们对它的作用不感兴趣,因为我只需要花一些时间来计算.
如果此片段按原样运行,它将按预期工作:它在启动后终止.如果我取消注释该Thread.sleep(1000)行并运行该程序,它将工作约12秒,然后打印出"退出"并终止.
据我所知,守护程序线程是如何工作的,我希望这段代码运行1秒然后终止执行,因为运行的唯一用户线程是使用main()方法启动的那个(runner后台守护程序线程)一旦1000毫秒通过,它就会到达执行结束,JVM应该停止.此外,看起来很奇怪"退出"仅在12秒后打印,而不是在程序启动时打印.
我错了吗?如何实现所需的行为(暂停一秒然后停止,独立于跑步者线程正在做什么)?
我在Linux机器上使用64位Oracle JDK 1.8.0_112,如果从IDE或命令行启动它也具有相同的行为.
谢谢,安德烈