5

到目前为止,我将我的应用程序用作独立产品。所以,当用户按下“停止”按钮时,我打了电话System.exit(0);,这很好。

现在我的应用程序将被另一个程序调用(以编程方式)。所以,我担心这System.exit(0);不仅会杀死我的进程,还会杀死启动我的程序的外部软件。

那么,如果收到来自外部软件的相应请求,关闭我的应用程序的正确方法是什么?我的应用程序是一个 GUI 应用程序。所以,我想关闭窗口,但我也想关闭我的程序执行的所有进程。

添加:

更具体地说,我想关闭我的程序启动的所有线程。我的程序不会启动任何操作系统进程或任何其他程序。

4

4 回答 4

2

如果您启动的线程仍在处理中,那么调用 System.exit(0) 将导致它们被杀死。在某些情况下,这会使您的应用程序处于不一致的状态。例如,假设线程正在保存一个文件。

在调用 System.exit 之前,您应该确保您的线程都“乐意”死掉。

对于长时间运行的线程,您可以使用的一种技术是中毒。为此,您向线程发送一条消息,即它们现在应该优雅地死去 - 即一条 poson 消息。一旦他们都死了,就可以安全地调用 System.exit(0) 来终止 Swing 事件处理线程。

有很多不同的实现中毒的方法,您可以设置一个全局标志变量,线程检查它们是否已中毒,或者您可以使用 Java 5 线程库。例如看一下这个 Javadoc,你会发现对这种技术的引用:

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html

于 2010-04-21T16:41:22.897 回答
0

只要您的程序不与其他人共享应用程序服务器,通过调用关闭 VM 就会System.exit(0) 终止所有线程。

Javadoc System.exit 终止当前运行的 Java 虚拟机)

编辑:如果你想在关机前做一些清理代码,http://java.sun.com/j2se/1.4.2/docs/guide/lang/hook-design.html

于 2010-04-21T16:12:53.387 回答
0

不幸的是,有一个“一刀切”的答案,这是 System.exit 的替代品。

您通常需要设置某种标志,向所有线程发出信号表明该退出了,并确保它们定期检查此标志。这将使它们能够优雅地清理而不会突然停止,并且还可以确保效果仅限于您自己的组件。在这种情况下,您的应用程序的主线程也将观察该标志,等待所有“worker”类型的线程完成,然后将一直返回堆栈,直到到达您的应用程序的入口点。

这个问题与不推荐使用的Thread.stop(等)方法并没有太大的不同,尤其是在用更尊重的东西替换 System.exit 方面。鉴于此,为什么不推荐使用 Thread.stop() 页面可能是有用的阅读。

抛出一个异常(一个叫做类似的自定义异常ApplicationStopException)来展开主线程的堆栈并不是一个坏主意。这可以防止您必须处理整个代码中的特殊逻辑,而是让“消息”传播到更高级别,在那里他们可以采取任何必要的行动来优雅地退出您的程序。

于 2010-04-21T16:53:44.537 回答
0

我建议您进行标记以停止线程,以便线程知道何时必须停止。对于 GUI 和窗口,您可以调用 frame.dispose()。

对于 System.exit(),我认为不会影响调用者,你可以试试看实际效果如何,但正如其他人已经推荐的那样,不要直接调用它,让线程自行停止

于 2010-04-21T16:58:44.157 回答