2009-10-23 127 views

回答

65

您可以將shutdown hook每當虛擬機關閉它獲取運行VM:

Java虛擬機在響應關閉以兩種事件:

  • 程序當最後一個非守護進程線程退出或退出(等效地,System.exit)方法被調用時退出,或者

  • 該virt響應於用戶中斷終止計算機,諸如鍵入Ctrl + C或系統範圍的事件,諸如用戶註銷或系統關閉。

你傳遞的關閉鉤子必須遵循一些規則,但是,一定要仔細閱讀所鏈接的文檔,以避免出現任何問題的線索。這包括確保線程安全,線程快速終止等。

另外,正如Jesper指出的那樣,關閉掛鉤保證在VM正常關閉時運行,但如果VM進程被強制終止,噸。如果原生代碼出現故障,或者您強行終止進程(kill -9taskkill /f),則可能會發生這種情況。

但是在這些情況下,所有的賭注都無濟於事,所以我不會浪費太多的思考。

+0

當心關閉掛鉤,不能保證在任何情況下運行;可能會出現這種情況,因爲它們沒有運行,所以請勿根據您在關機掛鉤中執行的操作來使程序正常運行。 – Jesper 2009-10-23 08:08:20

+0

當進程被強制終止時('TerminateProcess()'或'SIGKILL'),它們不會運行,但超出了正常運行的範圍,並且由於Ctrl + C已經被關閉鉤子覆蓋了,所以使用它是安全的。無論如何,如果操作系統真的終止你的進程,你不能做太多事情。 – Joey 2009-10-23 08:45:38

+0

如果我執行'kill'(發送一個TERM信號),這會在關機掛鉤中被捕獲嗎? (請注意,它不同於'kill -9',我從上面可以理解它不會陷入困境。) – ADTC 2013-11-07 11:20:20

14

只是爲了快速控制檯測試目的...

Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      try { 
       Thread.sleep(200); 
       System.out.println("Shouting down ..."); 
       //some cleaning up code... 

      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 
+2

你的例子是RaspberryPI特定的('SoftPwm','gpio')。您可能想要跳過這些方法調用。 – harpun 2015-10-04 13:41:24