2015-04-01 109 views
0

我有一個線程突然死在我身上。在Java中跟蹤消失的線程

線程主循環是這樣的:

while (true) { 
     try { 
      <snip> 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
    } 

,我開始它想:

thread.setUncaughtExceptionHandler((thread, throwable) -> { 
     throwable.printStackTrace(); 
    }); 

我有一個非常可重複的情況,即程序停止工作,當調用Eclipse調試器這線程無處可見。

如何發生這種情況,我怎麼能跟蹤它,我會想我的代碼會捕獲線程可能退出的所有可能的方式,我會得到堆棧跟蹤正在發生的事情...。

+2

愚蠢的問題,你叫'開始'? – MadProgrammer 2015-04-01 04:37:59

+0

如果你的while循環包含'break',那麼代碼將很高興地退出你的循環,並且線程將會結束(假設你首先啓動它)。 – Jason 2015-04-01 04:39:01

+0

好點!我將需要在那裏添加至少一個打印語句!應該看到了。 – nyholku 2015-04-01 04:40:41

回答

2

嘗試用try/finally塊封裝儘可能多的代碼,最高級別。除非調用System.exit(),否則在代碼退出該塊時應始終捕獲它。

正如您所發現的,代碼可能會自動退出的一種方式是如果您在沒有意識到的情況下使用了return;


您未捕獲的異常處理程序將只處理未捕獲例外。在這種情況下,你似乎正在捕捉所有例外情況。

當你有一個未捕獲異常時調用的方法在Thread中。

/** 
* Dispatch an uncaught exception to the handler. This method is 
* intended to be called only by the JVM. 
*/ 
private void dispatchUncaughtException(Throwable e) { 
    getUncaughtExceptionHandler().uncaughtException(this, e); 
} 
+1

是的,但是我會預料到在run的run循環中的try/catch拋出將捕獲所有的東西,未被捕獲的句柄只是爲了查看是否有東西沒有被捕獲。但是,即使線程死亡,也不會執行任何程序... – nyholku 2015-04-01 09:14:40

+0

如果您處於無法打印堆棧跟蹤的狀態,例如內存不足,則可以找到沒有打印錯誤。 – 2015-04-01 20:15:49

+0

我不認爲我內存不足,因爲程序繼續運行,否則罰款。爲了進一步調試,我將一個打印語句插入到了一個連續打印神祕線程isAlive()狀態的其他線程,事實上,它突然從true變爲false,所以當對象在那裏線程靜靜地死掉,因此調試器不會展示下。但是,這個奧祕依然存在,過早死亡的原因是什麼以及爲什麼我看不見它。 – nyholku 2015-04-02 03:35:18