2015-09-28 92 views
0

是有可能有一個方法中,當主線程或整個程序終止被稱爲?我知道Thread的.join()方法,但我認爲它不會在主線程中工作。例如,如果我創建一個臨時目錄,我想在程序結束時刪除臨時目錄,但我想這種情況發生時,該程序將終止,像主要的方法後,沒有。在主線程/程序終止時運行一個方法?

我不希望這樣的:

public static void main() { 
    ....Do something 
    ....Delete temp directory 
} 
+2

['運行#addShutdownHook'](https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#addShutdownHook-java.lang.Thread-) – MadProgrammer

回答

0

隨着用戶:Mad Programmer上面提到的,你可以使用ShutdownHook

public static void main(String[] args) 
{ 
    ShutdownHookThread shutdownHook = new ShutdownHookThread(); 
    Runtime.getRuntime().addShutdownHook(shutdownHook); 
} 

    private static class JVMShutdownHook extends Thread 
    { 
    public void run() 
    { 
    // tempDirectory.delete(); 
    } 
    } 
0

我看到四個可能的方法。

  1. 使用自己的Thread子類和重載的run()方法。爲線程終止添加一個finally塊。 2.使用一個可運行以類似的裝飾,也許作爲圍繞供給可運行的包裝。它的一個變種是爲了在構造時應用這個包裝器而繼承Thread的子類。 3.創建第二個線程在真實線程上加入(),從而檢測其終止。 4.使用工具重寫上面的Thread.run()方法。
1

只需添加一個關閉掛鉤..

Runtime.getRuntime().addShutdownHook(new Thread() { 
     @Override 
     public void run() { 
      System.out.println("ERMEHGERDDD"); 
     } 
    }); 

從的Javadoc:關閉鉤子只是一個初始化但尚未啓動的線程。當虛擬機開始其關閉序列時,它將以某種未指定的順序啓動所有已註冊的關閉掛鉤,並讓它們同時運行。當所有非守護進程線程結束

關閉掛接將被稱爲或者如果System.exit()的調用。