Существует консольное Java-приложение, которое должно работать до тех пор, пока оно не будет остановлено с помощью Ctrl + C или закрытия окна консоли. Как это приложение может быть запрограммировано на выполнение очистки кода перед выходом?Получить уведомление о завершении процесса Java
ответ
Вы можете использовать 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())
простою крюк путь, но имейте в виду, что нет никакой гарантии, что код действительно выполняется. Сбой JVM, сбои питания или простое «kill -9» на вашей JVM может предотвратить очистку кода. Поэтому вы должны убедиться, что ваша программа остается в стабильном состоянии, даже если она была прервана внезапно.
Лично я просто использую базу данных для всех состояний хранения. Модель транзакций гарантирует, что постоянное хранилище находится в нормальном состоянии независимо от того, что произойдет. Они проводят годы, делая этот код безупречным, поэтому почему я должен тратить свое время на проблемы, которые уже решены.
Код, написанный внутри Thread
сек run()
метод будет выполнять, когда объект выполнения заканчивается ...
class ShutdownHookclass extends Thread {
public void run() {
// perform shutdown actions
}
}
//could be written anywhere in your code
Runtime.getRuntime().addShutdownHook(new ShutdownHookclass())
Программа для удаления временного файла 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();}
}
}
+ 1 - Возможно, вы могли бы разработать с поучительным примером? ... – johnstok 2008-11-05 11:04:21