【发布时间】:2014-01-01 19:04:02
【问题描述】:
如果我们希望我们的程序正常关闭,我们会输入frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);。
如果我想让我的 java 程序写一些东西到一个文件然后关闭它自己怎么办。
实现它的最佳方式是什么?
【问题讨论】:
-
查看关闭挂钩。
-
谢谢大家,我明白了。
如果我们希望我们的程序正常关闭,我们会输入frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);。
如果我想让我的 java 程序写一些东西到一个文件然后关闭它自己怎么办。
实现它的最佳方式是什么?
【问题讨论】:
您可以尝试java.awt.event.WindowAdapter 并覆盖此方法:
windowClosing(WindowEvent e)
@AndrewThompson 发表了很好的评论。此外,在这里我只是假设了一个非常简单的纯 GUI 场景。通常,写入文件的线程也应该关心关闭文件通道,最好在 try/catch 块的 finally 子句中。在我看来,在最后一刻关闭资源的整个想法并不是那么好。
@Lind 在Runtime.addShutdownHook 的javadoc 中你可以阅读:
“关闭钩子在虚拟机生命周期的一个微妙时刻运行,因此应该进行防御性编码。特别是,它们应该被编写为线程安全的并尽可能避免死锁。它们还应该不要盲目依赖可能已经注册了自己的关闭钩子的服务,因此可能自己正在关闭过程中。尝试使用其他基于线程的服务,例如 AWT 事件调度线程,可能会导致死锁。
所以需要小心谨慎。如果您在shutdownhook 中使用您自己的程序的一部分或您自己的文件服务,它可能无法正常工作,但可以在WindowAdapter 中工作。如果你只在shutdownhook中直接依赖java.io-package,那么这种方法可能会奏效。
总的来说,我重复并确认资源最好不要这么晚关闭。你必须有充分的理由不这样做。
【讨论】:
for showing me a safer alternative 那么你有什么理由不使用更安全的替代方案。在这两种情况下,编码工作是相同的。与另一个相比,这有多个赞成票。我很好奇你为什么寻求建议却忽略了建议?
您可能想使用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");
}
}
);
}
}
【讨论】:
File 的错误方法(在问题中明确说明)。必须添加 -1 以防有人对此事感到困惑。