E.S*_*.S. 7 java user-interface exit jframe try-catch-finally
我有一个具有良好定义的Try/Catch/Finally链的应用程序,它在正常条件下退出并执行finally块,但是当有人过早地点击GUI中的红色X时,程序完全存在(代码= 0)并且主线程的finally块未被调用.
事实上,我确实希望程序在点击red-X时退出,但我不想要的是跳过finally {}块!我在GUI中手动放入finally块的最重要部分,但我真的不希望这样做,因为我希望GUI与实际程序分离:
class GUI { // ...
...
mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
try {
processObject.getIndicatorFileStream().close();
} catch (Exception ignore) {}
System.exit(0);
}
});
...
}
Run Code Online (Sandbox Code Playgroud)
但我更喜欢这样的电话:
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Run Code Online (Sandbox Code Playgroud)
并确保在Exit之后从每个线程调用所有finally {}块.
我知道这实际上是预期的.如果应用程序从一个单独的线程(比如GUI线程)关闭,那么主线程将停在其轨道上.
简而言之 - 我如何确保System.exit(0)或JFrame.EXIT_ON_CLOSE仍然会导致每个线程的finally块执行?
如果您没有其他设计更改选择,那么您可能需要的是JVM关闭挂钩,可以添加它以在System.exit调用时运行一段代码.
Shutdown Hooks是一种特殊的结构,允许开发人员插入一段代码,以便在JVM关闭时执行.如果我们需要在VM关闭的情况下进行特殊的清理操作,这就派上用场了.
你可以添加一个关闭钩子,如下所述:
Runtime.getRuntime().addShutdownHook(Thread)
Run Code Online (Sandbox Code Playgroud)
阅读更多关于关闭钩子的信息:
http://java.dzone.com/articles/know-jvm-series-2-shutdown
谨慎之言:
我们必须记住,不能保证关闭钩子总是会运行.如果JVM由于某些内部错误而崩溃,那么它可能会在没有机会执行单个指令的情况下崩溃.此外,如果O/S发出SIGKILL(http://en.wikipedia.org/wiki/SIGKILL)信号(Unix/Linux中的kill -9)或TerminateProcess(Windows),则应用程序需要立即终止甚至等待任何清理活动.除了上述内容之外,还可以通过调用Runime.halt()方法来终止JVM而不允许关闭挂钩运行.
| 归档时间: |
|
| 查看次数: |
7998 次 |
| 最近记录: |