正常退出应用程序? [英] Exiting an application gracefully?

查看:138
本文介绍了正常退出应用程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有明确定义的Try/Catch/Finally链的应用程序,该应用程序在正常情况下可以正常退出并执行finally块,但是当有人过早在GUI中击中红色X时,该程序就完全存在(代码= 0 ),并且不会调用主线程的finally块.

I have an application with a well defined Try/Catch/Finally chain that exits and executes the finally block just fine under normal conditions, however when someone prematurely hits the red X in the GUI, the program fully exists (code = 0) and the main thread's finally block isn't called.

实际上,我确实希望程序在单击红色X时退出,但是我不希望跳过finally {}块!我在GUI中手动放置了finally块的最重要部分,但是我真的不想这样做,因为我希望GUI与实际程序脱钩:

In fact, I do want the program to exit upon a click of the red-X, but what I do not want is a skipping of the finally{} block! I sort of put in the most important part of the finally block manually in the GUI but I really do not want to do it this way since I want the GUI decoupled from the actual program:

class GUI { // ...
...
mainFrame.addWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent evt) {
    try {
      processObject.getIndicatorFileStream().close();
    } catch (Exception ignore) {}
    System.exit(0);
  }
});
...
}

但是我更喜欢打这样的电话:

But I'd prefer to just have a call like this:

mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

并确保退出后,每个线程都调用了所有finally {}块.

And make sure that all the finally{} blocks get called from each thread after the Exit.

我知道这实际上是预期的.如果应用程序是从单独的线程(例如GUI线程)关闭的,则主线程将仅停止在其轨道中.

I know this is actually expected. If the application is closed from a separate thread (say the GUI thread) then the main thread will just stop in its tracks.

简而言之,如何确保System.exit(0)或JFrame.EXIT_ON_CLOSE仍将导致每个线程的finally块执行?

推荐答案

如果没有其他设计更改选择,那么您可能需要的是 JVM关闭挂钩 ,可以在调用System.exit时添加该代码以运行一段代码.

If you have no other design change choices then what you may need is a JVM shutdown hook, which can be added to run a piece of code when System.exit is called.

Shutdown Hooks是一种特殊的结构,允许开发人员插入 在JVM关闭时要执行的一段代码中.这 在我们需要进行特殊清理的情况下派上用场 在VM关闭的情况下进行操作.

Shutdown Hooks are a special construct that allow developers to plug in a piece of code to be executed when the JVM is shutting down. This comes in handy in cases where we need to do special clean up operations in case the VM is shutting down.

您可以按此处所述添加关闭钩子:

You can add a shutdown hook as mentioned here:

Runtime.getRuntime().addShutdownHook(Thread)

在此处阅读有关关机钩子的更多信息:

Read more about shutdown hooks here:

http://java.dzone.com/articles/know-jvm-series-2 -关闭

警告语:

我们必须牢记的是,不能保证关机 挂钩将始终运行.如果JVM因某些内部错误而崩溃, 那么它可能会崩溃而没有机会执行单个 操作说明.另外,如果操作系统给出了SIGKILL ( http://en.wikipedia.org/wiki/SIGKILL )信号(在Unix/Linux中为-9) 或TerminateProcess(Windows),则要求该应用程序执行以下操作: 立即终止,甚至不等待任何清理 活动.除上述内容外,还可以终止 JVM不允许通过调用运行关闭挂钩 Runime.halt()方法.

We must keep in mind is that it is not guaranteed that shutdown hooks will always run. If the JVM crashes due to some internal error, then it might crash down without having a chance to execute a single instruction. Also, if the O/S gives a SIGKILL (http://en.wikipedia.org/wiki/SIGKILL) signal (kill -9 in Unix/Linux) or TerminateProcess (Windows), then the application is required to terminate immediately without doing even waiting for any cleanup activities. In addition to the above, it is also possible to terminate the JVM without allowing the shutdown hooks to run by calling Runime.halt() method.

这篇关于正常退出应用程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆