2015-12-16 92 views
1

在Web應用程序中,我的代碼創建一些守護程序線程作爲內部類來檢查傳入請求中的某些信息。如何確保守護進程線程始終在Java中運行?

private static class AlertThread extends Thread { 

    private AlertThread() { 
     setDaemon(true); 
    } 

    public void run() { 
     while (true) { 
      try { 
       ... 
      } 
      catch (InterruptedException e1) { 
       LogFactory.getLog(AlertThread.class) 
         .warn("InterruptedException when waiting"); 
       e1.printStackTrace(); 
      } 
      catch (Exception e) { 
       mainLogger.error("Error processing Alert " + e.getMessage()); 
      } 
     } 
    } 
} 

代碼工作得很好,併線運行良好,但我想,以確保該線程將一直運行,並且如果它被殺死(被任何未知的原因),我應該如何重新啓動一個新的實例?

回答

3

最好的解決方案是不要讓它死在第一位。你可以做到這一點

public void run() { 
    while(true) { 
     try { 
      runOne(); 
     } catch(Throwable t) { 
      // log t 
     } 
    } 
} 

這個線程不會死,除非你關閉應用程序。

順便說一句你應該在啓動它之前讓這個線程成爲一個守護進程,並且你應該避免擴展Thread,因爲這樣做會導致細微的錯誤。

1

在編寫代碼時,while循環可以由不是Exception的任何Trowable終止。它可以是Error,例如StackOverflowError

+2

或者一些瘋狂的人可能會拋出一個'Throwable'或一個不是錯誤或異常的子類;) –

相關問題