【问题标题】:I want my app to do something before it closes我希望我的应用在关闭之前做一些事情
【发布时间】:2014-01-01 19:04:02
【问题描述】:

如果我们希望我们的程序正常关闭,我们会输入frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

如果我想让我的 java 程序写一些东西到一个文件然后关闭它自己怎么办。

实现它的最佳方式是什么?

【问题讨论】:

标签: java swing jframe exit


【解决方案1】:

您可以尝试java.awt.event.WindowAdapter 并覆盖此方法:

windowClosing(WindowEvent e)

@AndrewThompson 发表了很好的评论。此外,在这里我只是假设了一个非常简单的纯 GUI 场景。通常,写入文件的线程也应该关心关闭文件通道,最好在 try/catch 块的 finally 子句中。在我看来,在最后一刻关闭资源的整个想法并不是那么好。

@Lind 在Runtime.addShutdownHook 的javadoc 中你可以阅读:

“关闭钩子在虚拟机生命周期的一个微妙时刻运行,因此应该进行防御性编码。特别是,它们应该被编写为线程安全的并尽可能避免死锁。它们还应该不要盲目依赖可能已经注册了自己的关闭钩子的服务,因此可能自己正在关闭过程中。尝试使用其他基于线程的服务,例如 AWT 事件调度线程,可能会导致死锁。

所以需要小心谨慎。如果您在shutdownhook 中使用您自己的程序的一部分或您自己的文件服务,它可能无法正常工作,但可以在WindowAdapter 中工作。如果你只在shutdownhook中直接依赖java.io-package,那么这种方法可能会奏效。

总的来说,我重复并确认资源最好不要这么晚关闭。你必须有充分的理由不这样做。

【讨论】:

  • 谢谢伙计,下次我会使用它。Shutdownhook 似乎是目前的方法。
  • “Shutdownhook 似乎是目前要走的路。” 我强烈反对。 这是最好的方法。 关闭挂钩应该快速运行,如果用户关闭了磁盘,它很可能会失败。
  • 嗯,我打算用shutdown hook来编写和关闭文件通道。@AndrewThompson 上面的方法除了使用shutdownhooks的想法还有什么其他的优点吗? .@MenoHochschild 我唯一可以关闭资源的时间是在最后。
  • 感谢您的关注。你们都有正确的答案。我无法选择 2 个正确答案,但我会给您 +1 以向我展示更安全的选择和不同的方法。
  • @Lind for showing me a safer alternative 那么你有什么理由不使用更安全的替代方案。在这两种情况下,编码工作是相同的。与另一个相比,这有多个赞成票。我很好奇你为什么寻求建议却忽略了建议?
【解决方案2】:

您可能想使用Runtime.addShutdownHook。 Shutdown Hook 允许您在 VM 关闭之前执行线程。

这是一个小的用法示例:

public class Foo {

    public static void main(String... args) {
        Runtime.getRuntime().addShutdownHook(
            new Thread() {
                public void run() {
                    System.out.println("Hello");
                }
            }
        );
    }

} 

【讨论】:

  • 10/10。需要 7 分钟来选择您的答案。
  • 这是写入File 的错误方法(在问题中明确说明)。必须添加 -1 以防有人对此事感到困惑。
  • 这只是一个示例,说明如何在 VM 关闭之前使某些事情发生。不用打印“Hello”,Lind 显然可以使用 java.io API 打开一个文件,在其中写一些东西,然后适当地关闭它。我已经这样做了很多次(在我的情况下删除 .lock 文件),并且效果很好。所以我不明白你的反对意见?
  • 这正是我打算做的@Ol​​ivierCroisier。
  • “我已经这样做了很多次(在我的情况下删除 .lock 文件),效果很好。所以我不明白你的反对意见吗?”在自动关闭磁盘的“节能”模式下运行您的机器?你只为你的机器编码吗?你看过我的评论吗?我无法理解你对什么感到困惑。这是错误的方法,而且您的代码很脆弱。
猜你喜欢
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
相关资源
最近更新 更多