关闭程序时运行一个方法?

19
我需要在程序退出时执行一个创建文件的方法,应该如何做?
当我退出程序时,我需要执行一个创建文件的方法。如何实现呢?

1
你正在开发什么样的程序,是命令行、桌面、Web应用程序,还是其他的?你如何启动它,又怎样关闭它? - Anthony Accioly
我目前是通过在Eclipse中按下运行按钮来启动它,完成后将通过一个.jar文件运行,您只需单击普通的Windows关闭按钮即可关闭它。目前它是一个非常基本的游戏。 - Stan
那么,它是一个Swing应用程序,还是一个SWT应用程序? - Anthony Accioly
是的,这是一个Swing应用程序。 - Stan
6个回答

36

添加关闭钩子。请参考此javadoc

示例:

public static void main(String[] args) {
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
        public void run() {
            System.out.println("In shutdown hook");
        }
    }, "Shutdown-thread"));
}

我不太确定如何将这个实现到我的代码中。我能得到一些帮助吗? - Stan
如果你看一下Stan的其他问题,我不认为这是他需要的。 - Captain Giraffe
这个可以用,就是我想要的。对于所有糟糕的解释,我很抱歉,我不太擅长表达。 - Stan
太棒了!谢谢你,这真的很有用。 - Jake Stokes
请注意,有些情况下这种方法不起作用。例如,在Linux上,如果您使用kill <procId>命令杀死进程,它会起作用,但如果您使用kill -9 <procId>命令,则不会起作用。 - Black
run() 函数是在我关闭程序之前、期间还是之后运行的? - CiY3

8

因为您正在使用Swing。当您关闭应用程序(按下关闭按钮)时,您可以简单地隐藏您的框架。运行您想要创建文件并退出框架的方法。这将导致优美的退出。如果有任何错误/异常,您可以将其记录到单独的文件中。

代码如下:

package test;

import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JFrame;

public class TestFrame extends JFrame{

    public TestFrame thisFrame;

    public TestFrame(){
        this.setSize(400, 400);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
    }

    public static void main(String[] args){
        TestFrame test = new TestFrame();
        test.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentHidden(ComponentEvent e) {
                System.out.println("Replace sysout with your method call");
                ((JFrame)(e.getComponent())).dispose();
            }
        });
    }

}

请注意使用关闭挂钩。如Javadoc中所述,它指出:
当虚拟机由于用户注销或系统关闭而终止时,底层操作系统可能只允许一定的时间来关闭和退出。因此,在关闭挂钩中不建议尝试任何用户交互或执行长时间运算。

那么,我已经设置了frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);,但是,现在我该如何运行我想要的方法呢? - Stan
@Stan:嗨,Stan,我已经更新了代码。如果你有任何疑问,请问吧。 - bragboy
你可以在componentHidden()方法中运行任何你想要的方法。 - bragboy
组件适配器如何避免在关闭期间出现长时间运行的计算问题?在两种方式中,Windows都尝试关闭应用程序,然后应用程序执行其最后的计算,对吗?那么区别在哪里? - user3019423

3

2

addWindowListener是更好的解决方案:

frame.addWindowListener(new WindowAdapter()
{
    public void windowClosing(WindowEvent we)
    {
      // run methods before closing  

try {

                                Runtime.getRuntime().exec("taskkill /f /im java.exe");

                            } catch (IOException e4) {
                                // TODO Auto-generated catch block
                                e4.printStackTrace();
                            }

    }
});

0
class ExitThread extends Thread {

         public void run() {
             // code to perform on exit goes here
         }
     }

//in main or wherever, beginning of execution
ExitThread t = new ExitThread();
//don't call t.start(), the hook will do it on exit
addShutdownHook(t);

虽然我没有测试过,但这应该可以让你开始。此外,如果您想将一些参数传递给该线程,则不必使用默认构造函数。


0
您还可以为应用程序添加一个窗口关闭监听器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接