2009-11-19 41 views
0

當我開始兩個線程與定時器與TimerTask異常失去了一個線程

Timer timer = new Timer(); 
      TimerTask task = new TimerTask() { 
       public void run() { 
        doSomething(); 
       } 
      }; 
      Calendar start = Calendar.getInstance(); 
      timer.scheduleAtFixedRate(task, start.getTime(), 
        1000 * 60 * 60); 

現在有時第二個線程停止。當線程停止時,是否有可能觀察到線程可能發送郵件,也許是通過查找第二個線程的第三個線程?

回答

2

您需要將基準存到自己Timer活着 - 如果Timer是垃圾回收,該線程將停止。從the docs

的最後一次現場參照 Timer對象後消失,所有 未完成的任務已經完成了 執行,計時器的任務執行 線程終止優雅(和 成爲受垃圾 集合)。但是,這可能會發生任意長時間的 。默認情況下, 任務執行線程不會運行 作爲守護進程線程,因此它有能力 保持應用程序從 終止。如果主叫方想要 快速終止定時器的任務執行 ,則主叫方應該調用定時器的取消方法。

可能不是問題,但它是最可能的原因。我假設你能保持線程活着,你不需要檢查它的任何東西?

+0

肯定=)但我想監視每個異常和錯誤,併發送電子郵件,如果我的工具出了問題=) – 2009-11-19 09:27:55

+0

@ Xelluloid:你當然可以在計時器線程中添加一種「心跳」然後每隔一段時間添加一個新線程*檢查*心跳。它只是推動相同的問題高一級雖然:) – 2009-11-19 10:15:10

0

我建議在您的程序中添加Thread#setDefaultUncaughtExceptionHandler。你可以有這個日誌/電子郵件/等..雖然有一個catch(Throwable)是更好的設計,有一個未捕獲的異常處理程序可以處理任何你想念的情況。

+0

但它不是一個異常,但拋出一個錯誤:) – 2009-11-19 10:58:32