2011-11-17 80 views
9

如果我添加一個關閉鉤子到我的Java程序的運行,像這樣:當關閉掛鉤破壞

public class MyShutdownHook implements Runnable 
{ 
    @Override 
    public void run() 
    { 
     // Stuff I want executed anytime 
     // the program, Java, or the OS exits normally, 
     // crashes, or terminates unexpectedly for any reason. 
    } 
} 

// The in another method... 
Runtime.getRuntime().addShutdownHook(new MyShutdownHook()); 

...然後在那裏以往任何情況下是run()方法將不會被執行當程序/ Java/OS正常退出時,意外崩潰或終止?如果是這樣,什麼情況能夠繞過Runtime的關機掛鉤,爲什麼?

+1

從不打折的可能性在您的計算機上發生核攻擊。 –

+0

除了javadoc對這項工作的描述之外,你還需要更多的信息嗎? –

+0

@Mark Peters::)有趣的笑話...但是別忘了* SIGKILL *非常*是一個原子waepon; )在Linux和OS X上(兩個名稱只有兩個Un * x-like通常由開發人員使用)* kill -9 * *有保證*可以立即終止進程並釋放其資源,不問任何問題。否* ShutDownHook *。沒什麼。現在我同意:Java進程不會看到* kill -9 *與核攻擊之間的任何區別; ) – TacticalCoder

回答

6
  • 如果進程被終止,將不會執行關閉掛鉤。

  • 如果進程崩潰,將不會執行關閉掛鉤。

  • 如果您有Windows服務,並且關機掛鉤需要很長時間才能執行,它將被終止。

+1

請記住,只有SIGKILL,SIGTERM和類似的程序仍然會運行關閉鉤子 – Jarek

+2

如果進程發送了SIGTERM信號(UNIX中的常規「kill」命令),那麼關閉鉤子將運行。如果發送SIGKILL(kill -9),它將只運行失敗。 – Adamski

+0

如果你想成爲書呆子,如果我'殺死-11 'Java進程它也不會在那裏運行關閉掛鉤。雖然我想你可能會說這屬於「崩潰」的子彈。 –

3

如果將插頭從計算機背面拔出,則關閉掛鉤將不會運行。其他情況包括:

  • 進程在使用SIGKILL(-9)的POSIX OS上被終止。
  • 同樣,如果您選擇在Windows下終止「無響應」進程,則關閉掛鉤可能無法完成。
0

只有當進程「正常關閉」時,它們纔會運行。如果該進程被操作系統強行殺死,或者由於資源問題(例如,內存不足)而崩潰,則不會調用關閉鉤子。

0

當你做Runtime.getRuntime().halt() JVM或當操作系統終止進程沒有允許它運行的清理工作,還當你日食終止程序(eclipse下運行時)

0

任何時候JVM可以退出優雅地,關機掛鉤運行。它不運行,如果:

  • JVM崩潰。 (取決於如何/時崩潰,鉤可能仍然運行,但無法保證製成)
  • 的JVM得到SIGKILL或相似,並立即由OS停止