2015-04-01 66 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