常规退出和日食终止有什么区别



发生的情况是,当我按ALT + F4(Win)或CMD + Q(Mac)退出程序时,程序将挂起,直到我使用任务管理器强制退出它。

但是,当我使用 eclipse 的终止按钮终止程序时,程序可以很好地关闭而不会挂起。

关闭应用程序的两种方法有什么区别?

例如,是因为当我们执行常规退出(即 ALT+F4)时,应用程序中的线程不会自行终止,而在 eclipse 中,线程被"强制"终止?

编辑

我刚刚意识到System.exit(0)等同于"强制退出"(即没有挂起)。有什么方法可以检测何时按下 ALT+F4 或 CMD+Q,然后从那里,系统/程序将执行System.exit

编辑 2

我已经完成了以下操作,但挂起仍然存在:

  1. 我尝试将所有线程更改为守护程序。

  2. 我已经使用 jvisualvm 来查看按下 ALT+F4 后哪些线程仍在运行。我确实意识到一些"Pool-i 线程-i"线程仍在运行。(有没有办法确定代码的哪一部分代表"Pool-i Thread-i"?我怀疑这些线程是由我使用的第三方库之一创建的。

  3. 在我的线程/可调用对象中,我在线程的最末端有一个控制台输出,当我ALT+F4程序时将显示控制台输出。例如

public Void call() {
    while(true) {
        
    }
    System.out.println("Thread has finished");
}

当我按 ALT+F4 时,控制台将打印"线程已完成",因此我假设这些线程已正确终止。

Eclipse 终止按钮基本上执行任务管理器中的强制退出 - 它强制终止进程。Alt+F4 或 CMD+Q 通知程序要终止,程序应及时响应;如果没有,您将在 Windows 中收到无响应程序警报。

最新更新