检测到 JVM 正在关闭

Jas*_*n S 3 java swing event-dispatch-thread shutdown-hook

我有一个使用 addShutdownHook() 处理 Ctrl+C 的 Swing 应用程序,它工作正常,直到我有一个关闭任务调用一个函数,该函数在正常情况下更改 JLabel 文本,此时它挂起。

我认为问题在于 Swing EDT 已终止或正在等待某些事情。

有没有办法确定 EDT 已终止或“完成”(因此我可以避免调用 Swing 方法),或者防止在 Ctrl-C 上通常关闭所有窗口的行为?


只是为了澄清:

我在一个名为 的类中有一个方法stop()。在正常情况下,这可以被调用(连同它的补码start()),它会触发一连串的事情,导致 JLabel 被更新,以获得stop()已经发生的视觉反馈。

当我的关闭挂钩运行时,我需要调用stop()以正常关闭某些资源。

我要问的是如何检测 Swing EDT 不存在,以便我可以重写,stop()以便检测缺少 Swing 并避免调用 Swing 函数。

Igo*_*din 5

以下 hack 有助于确定 JVM 是否正在关闭而不传递任何标志:

private static final Thread DUMMY_HOOK = new Thread();

public static boolean isShuttingDown()
{
    try {
        Runtime.getRuntime().addShutdownHook(DUMMY_HOOK);
        Runtime.getRuntime().removeShutdownHook(DUMMY_HOOK);
    } catch ( IllegalStateException e ) {
        return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

但不要忘记可能的并发问题。