发生的情况是,当我按ALT + F4(Win)或CMD + Q(Mac)退出程序时,程序将挂起,直到我使用任务管理器强制退出它。
但是,当我使用 eclipse 的终止按钮终止程序时,程序可以很好地关闭而不会挂起。
关闭应用程序的两种方法有什么区别?
例如,是因为当我们执行常规退出(即 ALT+F4)时,应用程序中的线程不会自行终止,而在 eclipse 中,线程被"强制"终止?
编辑
我刚刚意识到
System.exit(0)
等同于"强制退出"(即没有挂起)。有什么方法可以检测何时按下 ALT+F4 或 CMD+Q,然后从那里,系统/程序将执行System.exit
?编辑 2
我已经完成了以下操作,但挂起仍然存在:
我尝试将所有线程更改为守护程序。
我已经使用 jvisualvm 来查看按下
ALT+F4
后哪些线程仍在运行。我确实意识到一些"Pool-i 线程-i"线程仍在运行。(有没有办法确定代码的哪一部分代表"Pool-i Thread-i"?我怀疑这些线程是由我使用的第三方库之一创建的。在我的线程/可调用对象中,我在线程的最末端有一个控制台输出,当我
ALT+F4
程序时将显示控制台输出。例如
public Void call() {
while(true) {
}
System.out.println("Thread has finished");
}
当我按
ALT+F4
时,控制台将打印"线程已完成",因此我假设这些线程已正确终止。
Eclipse 终止按钮基本上执行任务管理器中的强制退出 - 它强制终止进程。Alt+F4 或 CMD+Q 通知程序要终止,程序应及时响应;如果没有,您将在 Windows 中收到无响应程序警报。