2015-10-15 85 views
0

我已經搜索了網絡,並且一直未能找到結果。我正在尋找一個Listener,當一個jar崩潰/停止時,它就會被調用。我知道他們是這樣的JFrame,但我沒有使用框架。 謝謝,艾利。Java應用程序停止或崩潰時的監聽器

+0

編輯標題: 「jar」不是描述它的最好的詞,希望對你有好處。 – laune

回答

4

查找到java.lang.Runtime中,方法

void addShutdownHook(Thread hook) 

從它的javadoc只有一句話(但一定要閱讀所有的小字有):當虛擬機開始關閉序列,它將以某種未指定的順序啓動所有已註冊的關閉掛鉤,並讓它們同時運行。

這裏是一個 「撞車」 的堆棧溢出引起:

static void rec(){ rec(); } 

public static void main(String[] args){ 

    Thread thread = new Thread(){ 
     public void run(){ 
      System.out.println("SHUTDOWN"); 
     } 
    }; 
    Runtime.getRuntime().addShutdownHook(thread); 
    rec(); 
} 

和它打印關機。

這是一個應用程序uing相同關閉掛鉤作爲睡覺,可以使用Ctrl-C或爲BG工作在Linux風格kill %1被殺害之前:

Runtime.getRuntime().addShutdownHook(thread); 
try { 
    System.out.println("Sleeping"); 
    Thread.sleep(5000); 
    System.out.println("Waking"); 
} catch(Exception e){ 
} 

和它打印關機。

最後,這裏的挑釁java.lang.OutOfMemoryError: Java heap space

List<Object> objs = new ArrayList<>(); 
while(true){ 
    objs.add(new byte[0x10000000]); 
} 

和它打印關機。 (對於堆空間的大量抓取,關閉鉤子甚至可以創建一些新的對象,但是應該這樣寫,以便線程已經將所有需要的對象包含在其預先分配的內存中)。

+0

如果您的應用程序崩潰或使用kill命令停止,它將無法工作。 – Stanislav

+0

@Stanislav添加了一些演示。不知道你的意思是「崩潰」或「停止」。很明顯,如果JVM本身被內存耗盡,關閉掛鉤將不會執行,但不會執行任何操作。 – laune

+0

我的意思是,你可以用完內存或者進程被SIGKILL信號終止。在這種情況下,shutdownhook不會被調用。此外,必須小心使用shutdownhook,只需看一看javadoc,看看它是否有一些特定的行爲,例如直到最後才能執行,如果需要很長時間,因爲JVM沒有等待爲它完成。我只是假設,如果你給這個解決方案,你必須提供關於這種特定行爲的信息。 – Stanislav