跟踪Java中消失的线程

时间:2015-04-01 04:35:40

标签: java multithreading

我有一个突然死在我身上的线程。

线程主循环如:

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

我开始就像:

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

我有一个非常可重复的情况,程序停止工作,当我调用Eclipse调试器时,这个线程无处可见。

如何发生这种情况以及如何跟踪它,我原以为我的代码会捕获线程可以退出的所有可能方式,并且我会得到正在发生的事情的堆栈跟踪......。

1 个答案:

答案 0 :(得分: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);
}