2008-11-05 36 views
6

Có một ứng dụng Java trên bàn điều khiển được cho là chạy cho đến khi nó bị dừng lại bởi Ctrl + C hoặc đóng cửa sổ bảng điều khiển. Làm thế nào ứng dụng đó có thể được lập trình để thực thi một mã làm sạch trước khi thoát?Nhận thông báo về chấm dứt quá trình Java

Trả lời

13

Bạn có thể sử dụng Shutdown Hook.

Về cơ bản, bạn cần tạo một Chủ đề sẽ thực hiện các hành động tắt máy của bạn và sau đó add it as a shutdown hook. Ví dụ:

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

// Then, somewhere in your code 

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

+ 1 - Có lẽ bạn có thể xây dựng với một ví dụ hướng dẫn? ... – johnstok

+0

Ví dụ được thêm vào. Cảm ơn. –

1

Móc tắt là cách để thực hiện, nhưng lưu ý rằng không có gì đảm bảo rằng mã thực sự được thực thi. Sự cố JVM, sự cố mất điện hoặc một "kill -9" đơn giản trên JVM của bạn có thể ngăn mã không bị xóa. Vì vậy, bạn phải đảm bảo rằng chương trình của bạn vẫn ở trạng thái nhất quán ngay cả khi nó đã bị hủy bỏ đột ngột.

Cá nhân, tôi chỉ đơn giản sử dụng cơ sở dữ liệu cho tất cả lưu trữ trạng thái. Mô hình giao dịch của nó đảm bảo rằng lưu trữ liên tục ở trạng thái thông minh bất kể điều gì xảy ra. Họ dành nhiều năm để làm cho mã ngu ngốc đó, vậy tại sao tôi nên lãng phí thời gian của mình vào những vấn đề đã được giải quyết.

0

Mã được viết bên trong một Thread s run() phương pháp sẽ thực hiện khi đối tượng runtime chấm dứt ...

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

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

Chương trình xóa tập tin tạm thời bat.bat khi chương trình được thoát:

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

    } 

    } 
Các vấn đề liên quan