我有一个使用 addShutdownHook() 处理 Ctrl+C 的 Swing 应用程序,它工作正常,直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数,此时它挂起。
我认为问题是 Swing EDT 已终止或正在等待某些内容。
有没有办法确定 EDT 已终止或“完成”(这样我就可以避免调用 Swing 方法),或者阻止 Ctrl-C 上通常的关闭所有窗口行为?
只是为了澄清:
我在一个名为的类中有一个方法stop()
。在正常情况下,这可以被调用(连同它的补集)start()
)并且它会触发一系列事件,导致 JLabel 更新,以获得视觉反馈stop()
已经发生了。
当我的关闭挂钩运行时,我需要调用stop()
优雅地关闭一些资源。
我要问的是如何检测到 Swing EDT 不存在,以便我可以重写stop()
这样它就会检测到 Swing 的缺失并避免调用 Swing 函数。
以下 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;
}
但不要忘记可能的并发问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)