Java 我希望我的应用程序在关闭前做些什么

Java 我希望我的应用程序在关闭前做些什么,java,swing,jframe,exit,Java,Swing,Jframe,Exit,我们将frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)放到

我们将
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)放到如果我们想让程序正常关闭

如果我想让我的java程序将某些东西写入一个文件,然后关闭它自己呢


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

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

windowClosing(WindowEvent e)
@安德烈霍姆普森的评论很好。此外,这里我假设了一个非常简单的仅GUI的场景。通常,写入文件的线程也应该关心关闭文件通道,最好是在try/catch块的finally子句中。在我看来,在最后一刻关闭资源的整个想法并不那么好

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

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

因此,一定要小心。如果您在shutdownhook中使用自己的部分程序或文件服务,它可能不起作用,但在WindowAdapter中会起作用。如果您只直接依赖shutdownhook中的java.io-package,那么这种方法可能会起作用


一般来说,我重复并确认最好不要这么晚关闭资源。您必须有很好的理由这样做。

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

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

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

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

因此,一定要小心。如果您在shutdownhook中使用自己的部分程序或文件服务,它可能不起作用,但在WindowAdapter中会起作用。如果您只直接依赖shutdownhook中的java.io-package,那么这种方法可能会起作用

一般来说,我重复并确认资源最好不要这么晚关闭。您必须有很好的理由这样做。

您可能需要使用。 关闭挂钩允许您在VM关闭之前执行线程

下面是一个小的用法示例:

public class Foo {

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

} 
您可能想使用。 关闭挂钩允许您在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分钟来选择答案。这是写入
文件的错误方法(在问题中明确说明)。必须添加一个-1,以防任何人对此感到困惑。这只是一个关于如何在VM关闭之前发生某些事情的示例。Lind显然可以使用java.io API打开文件,在其中写入一些内容,然后关闭它。我已经做了很多次(在我的例子中删除.lock文件),而且效果很好。所以我不理解你的否决票?这正是我打算@OlivierCroisier做的。“我已经做了很多次了(在我的案例中删除.lock文件),效果很好。所以我不明白你的否决票?“您是否在自动关闭磁盘电源的“节能”模式下运行机器?你只为你的机器编码吗?你看过我的评论了吗?我不明白你对什么感到困惑。这是错误的方法,您的代码很脆弱。10/10。需要7分钟来选择您的答案。这是写入
文件的错误方法(在问题中明确说明)。必须添加一个-1,以防有人对此感到困惑。这只是一个关于如何在虚拟机关闭之前使某些事情发生的示例。Lind显然可以使用java.ioAPI打开一个文件,在其中写入一些内容,然后关闭它,而不是打印“Hello”。我已经做过很多次了(在我的例子中删除.lock文件),效果非常好。所以我不理解你的否决票?这正是我打算@OlivierCroisier做的。“我已经做了很多次了(在我的情况下删除.lock文件),效果很好。所以我不理解你的否决票?”你是否在“节能”模式下运行机器,自动关闭磁盘电源?你只为你的机器编码吗?你看过我的评论了吗?我不明白你对什么感到困惑。这是一个错误的方法,而且你的代码很脆弱。谢谢你,伙计,我下次再使用它。现在应该使用Shutdownhook。“现在应该使用Shutdownhook。”我强烈反对。这是最好的办法。关机钩子应该运行得很快,如果用户关闭了磁盘电源,它很可能会失败。嗯,我打算用关机钩子写入并关闭文件通道。@AndrewThompson上述方法比使用关机钩子还有其他优点吗@MenoHochschild是唯一一次我可以