2013-03-06 65 views
2

我創建了一個Runnable類,負責監視文件更改的目錄。確保無限循環線程在主應用程序崩潰時停止

... imports ... 

public class ExamplePathWatch implments Runnable { 
    ... 
    private boolean isRunning = true; 
    ... 

    @Override 
    public void run() { 
     while(isRunning) { 
      [1]... wait for a file change ... 
      [2]... notify listeners of file change (if any) ... 
     } 
    } 

    public synchronized void stopPathWatch() { 
     isRunning = false; 
     ... interrupt [1] and allow the thred to exit immediately... 
    } 

螺紋暫停在[1]直到一個文件變化時,或stopPathWatch()方法被調用它設置isRunning = false並中斷電流[1]等待。

就在主應用程序退出之前,調用了stopPathWatch(),它允許線程退出並且整個應用程序完全終止。

我的問題是,當應用程序崩潰時,主應用程序終止,不調用stopPathWatch()。因此,應用程序會一直在後臺運行,直到它通過操作系統被終止。

由於應用程序的開發非常活躍,並且並不是所有異常都得到處理,所以有一種推薦的方法可以確保子線程停止,無論主應用程序如何終止?

感謝

+1

如果有任何線程仍在運行(線程!=進程),則您的應用程序不會崩潰。你對崩潰的定義是什麼? – Perception 2013-03-06 13:41:51

+3

Call setDaemon() – 2013-03-06 13:42:14

回答

8

您可以運行ExamplePathWatch作爲守護線程。只有未標記爲守護進程的線程纔會阻止應用程序退出。

+1

是的,我將添加:除非有明確停止/終止應用程序生存期線程的重要原因,否則始終將它們設置爲守護進程並且不要嘗試。 – 2013-03-06 13:46:02

1

您可以將它關閉掛鉤:

Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { 
     stopPathWatch(); 
    } 
}); 

此代碼必須去某處在你的程序。

+1

在這種情況下,關閉掛鉤並不會起到作用,因爲仍在運行的後臺線程是阻止首先關閉的關機。 – 2013-03-06 13:45:19

相關問題