有一个控制台Java应用程序应该运行,直到它被Ctrl + C停止或关闭控制台窗口。如何将该应用程序编程为在退出之前执行清理代码?
答案 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())