Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中跟踪正在消失的线程_Java_Multithreading - Fatal编程技术网

在Java中跟踪正在消失的线程

在Java中跟踪正在消失的线程,java,multithreading,Java,Multithreading,我有一根线突然在我身上消失了 线程主循环类似于: while (true) { try { <snip> } catch (InterruptedException e) { e.printStackTrace(); } catch (Throwable e) { e.printStackTrace(); } } 我有一个非常可重复

我有一根线突然在我身上消失了

线程主循环类似于:

    while (true) {
        try {
            <snip>
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
我有一个非常可重复的情况,在这种情况下,程序停止工作,当我调用Eclipse调试器时,这个线程就不存在了


这是如何发生的,我如何跟踪它,我本以为我的代码会捕获线程可能退出的所有可能方式,我会得到正在发生的事情的堆栈跟踪…

尝试在最高级别用Try/finally块包装尽可能多的代码。除非调用System.exit(),否则当代码退出块时,应该始终捕获该消息

正如您所发现的,如果使用
return未意识到它


未捕获异常处理程序将仅处理未捕获异常。在这种情况下,您似乎捕获了所有异常

在线程中存在未捕获异常时调用的方法

/**
 * 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);
}

愚蠢的问题,如果while循环包含一个
中断,你是否调用了
start
然后代码将愉快地退出您的循环,线程将结束(假设您首先启动它)。这一点很好!我将需要添加至少一个打印声明那里!应该已经看到了。忘记回答:是的,我调用start(),线程运行得很好,直到用户执行了一个特定的“命令”,导致试图清除这个正在消失的线程和另一个线程之间的特定队列。如果我清除队列,那么这个特定的线程就不会消失。关于“中断”的可能性,我尝试在循环后添加println()语句,但Eclipse以“无法访问的代码”拒绝了,所以我猜不会有中断导致这个问题是的,但我本以为在踏板的运行循环中,try/catch-throwable会捕获所有东西,未捕获的手柄只是为了查看是否有东西没有被捕获。但是,即使线程死亡,也不会执行on…如果您处于无法打印堆栈跟踪的状态(例如内存不足),您可以发现没有打印错误。我认为我没有内存不足,因为程序一直在正常运行。为了进一步调试,我在另一个线程中插入了一条print语句,该语句会连续打印神秘线程isAlive()状态,事实上,它会突然从true变为false,因此当对象在那里时,线程会安静地死去,因此调试器不会显示它。但谜团依然存在,早死的原因是什么,为什么我看不见它。@nyholku如果你不能追踪它,这听起来像是一个低级的虫子。能否在run()的最高级别上放置try/finally,并查看是否调用finally块?你有哪个版本的Java?在我使用return而不是break的switch语句中的循环内的一个代码路径中发现了这个问题,非常愚蠢。啊!但是,如果我最终按照您的建议使用(在看到您的建议之前找到了bug),我会发现实际上这只是循环中的“正常”退出,我肯定会以这种方式找到bug。因此,如果你想给出一个关于使用“finally”来追踪问题的答案,我会接受它,并让你得到布朗尼分数。
/**
 * 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);
}