获取有关Java进程终止的通知

时间:2008-11-05 10:51:45

标签: java

有一个控制台Java应用程序应该运行,直到它被Ctrl + C停止或关闭控制台窗口。如何将该应用程序编程为在退出之前执行清理代码?

4 个答案:

答案 0 :(得分:14)

您可以使用Shutdown Hook

基本上你需要创建一个执行关机操作的线程,然后add it as a shutdown hook。例如:

class ShutdownHook extends Thread
{
    public void run()
    {
        // perform shutdown actions
    }
}

// Then, somewhere in your code

Runtime.getRuntime().addShutdownHook(new ShutdownHook())

答案 1 :(得分:2)

关闭挂钩是可行的方法,但请注意,无法保证代码实际执行。 JVM崩溃,电源故障或JVM上的简单“kill -9”可能会阻止代码清理。因此,即使突然中止,您也必须确保程序保持一致状态。

就个人而言,我只是将数据库用于所有状态存储。它的事务模型确保持久存储无论发生什么都处于理智状态。他们花了数年时间使代码变得傻瓜,所以为什么我要把时间浪费在已经解决的问题上。

答案 2 :(得分:1)

程序退出时删除临时文件bat.bat的程序:

public class Backup {

    public static void createBackup(String s)
    {

        try{
            String fileName ="C:\\bat"+ ".bat";
            FileWriter writer=new FileWriter(fileName);
            String batquery="cd C:\\Program Files\\MySQL\\MySQL Server 5.0\\bin"
                    + "\nmysqldump -uroot -proot bankdb > \""+s+".sql\""                    
                    +"\nexit";

            writer.append(batquery);
            writer.close();
        }
        catch(Exception e){e.getMessage();}
        try{
            Process p =Runtime.getRuntime().exec("cmd /c start C:\\bat.bat");

        }
        catch(Exception e){e.getMessage();}
        ShutDownHook sdh=new ShutDownHook();
        Runtime.getRuntime().addShutdownHook(sdh);
    }


}

  class ShutDownHook extends Thread
    {
        public void run()
    {
        try
        {
            File f=new File("c:/bat.bat");
            f.delete();
        }
        catch(Exception e){e.getMessage();}

    }

    }

答案 3 :(得分:0)

Thread run()方法中编写的代码将在运行时对象终止时执行...

class ShutdownHookclass extends Thread {
    public void run() {
        // perform shutdown actions
    }
}

//could be written anywhere in your code
Runtime.getRuntime().addShutdownHook(new ShutdownHookclass())