Ale*_*man 7 java swing shutdown
是否有任何可能的方法将swing添加到关闭钩子中(即,在VM关闭时显示弹出窗口)?
我意识到如果我尝试创建一个新的JFrame,它会给我一个错误,因为它试图注册一个关闭钩子,因为VM已经关闭而失败.我只是想知道是否有任何解决方法
old*_*inb 14
你真的不应该这样做.从该Runtime.addShutdownHook规范:
Java虚拟机关闭以响应两种事件:
- 该程序退出通常,当最后一个非守护线程退出或时
exit(等效地,System.exit)方法被调用,或- 虚拟机将响应用户中断(例如键入)或系统范围事件(例如用户注销或系统关闭)而终止
^C....
关闭挂钩在虚拟机的生命周期中的微妙时间运行,因此应该进行防御性编码.特别是它们应该被编写为线程安全的并且尽可能避免死锁.他们也不应盲目依赖可能已经注册了自己的关机钩子的服务,因此他们自己可能正在关闭.例如,尝试使用其他基于线程的服务(例如AWT事件派发线程)可能会导致死锁.
关机挂钩也应该快速完成工作.当程序调用
exit期望时,虚拟机将立即关闭并退出.当虚拟机因用户注销或系统关闭而终止时,底层操作系统可能只允许一段固定的时间来关闭和退出.因此,不建议尝试任何用户交互或在关闭钩子中执行长时间运行的计算....
在极少数情况下,虚拟机可能会中止,即停止运行而不会干净地关闭.当虚拟机在外部终止时会发生这种情况,例如
SIGKILLUnix 上的信号或TerminateProcessMicrosoft Windows上的调用.如果本机方法因例如破坏内部数据结构或尝试访问不存在的内存而出错,则虚拟机也可能中止.如果虚拟机中止,则无法保证是否将运行任何关闭挂钩.
这里的具体警告暗示你不要这样做:
"关闭钩子也应该快速完成他们的工作."
依赖于可能需要一段时间才能完成其工作的任何事情,或无限期地阻止用户输入的JOptionPane对话框,这不是你在关机钩子中应该做的事情.
"例如,尝试使用其他基于线程的服务(例如AWT事件派发线程)可能会导致死锁"
Swing在AWT上运行,它的底层事件派发线程也可能正在关闭.试图在关闭时使用Swing或AWT不仅会导致死锁,而且可能根本不起作用.
"如果虚拟机中止,则无法保证是否会运行任何关闭挂钩"
无法保证您的用户甚至可能收到您的消息,因为关闭挂钩只能保证在正常退出或终止时运行 - 而不是在暂停或中止时.
| 归档时间: |
|
| 查看次数: |
1645 次 |
| 最近记录: |