2008-11-05 3 views
6

Существует консольное Java-приложение, которое должно работать до тех пор, пока оно не будет остановлено с помощью Ctrl + C или закрытия окна консоли. Как это приложение может быть запрограммировано на выполнение очистки кода перед выходом?Получить уведомление о завершении процесса Java

ответ

13

Вы можете использовать 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()) 
+0

+ 1 - Возможно, вы могли бы разработать с поучительным примером? ... – johnstok 2008-11-05 11:04:21

1

простою крюк путь, но имейте в виду, что нет никакой гарантии, что код действительно выполняется. Сбой JVM, сбои питания или простое «kill -9» на вашей JVM может предотвратить очистку кода. Поэтому вы должны убедиться, что ваша программа остается в стабильном состоянии, даже если она была прервана внезапно.

Лично я просто использую базу данных для всех состояний хранения. Модель транзакций гарантирует, что постоянное хранилище находится в нормальном состоянии независимо от того, что произойдет. Они проводят годы, делая этот код безупречным, поэтому почему я должен тратить свое время на проблемы, которые уже решены.

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()) 
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();} 

    } 

    }