我刚刚发现守护线程存在一些奇怪的行为,这个问题我无法解释。我将代码精简至最小,以便验证:
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.");
}
< p > runner线程执行的代码在我的电脑上需要大约12秒才能终止,由于我只需要花一些时间计算,所以我们对它做的事情不感兴趣。< /p>
< p > 如果按照原样运行此片段,则按预期工作:它在启动后立即终止。如果取消注释Thread.sleep(1000)行并运行程序,则它将工作约12秒,然后打印出“Exiting”并终止。< /p>
< p > 就我了解的守护线程的工作方式而言,由于唯一运行的用户线程是使用main()方法启动的那个(runner是后台守护线程),因此一旦过去1000毫秒,它就到达了执行结束,并且JVM应该停止。此外,“Exiting”仅在12秒后打印出来,而不是程序启动时,这看起来非常奇怪。< /p>
< p > 我错了吗?如何实现所需的行为(暂停一秒钟,然后停止,与runner线程正在做的无关)?< /p>
< p > 我在Linux系统上使用64位Oracle JDK 1.8.0_112,在IDE或命令行中启动都有相同的行为。< /p>
< p > 谢谢,Andrea< /p>