我正在使用线程,但过了一段时间后,大多数人都停止了工作。我认为第一件事就是死锁,但所有人都处于状态RUNNING。
我想我的逻辑或新特性出现了错误,我没有意识到,我必须处理(这是一个网络浏览器)。
是否可以获取当前正在执行的方法或操作?我希望这能看到我的线程被困在哪里。
编辑:我认为这是我需要处理的事情,或者我的逻辑中存在错误,因为这是在执行一段时间后发生的,而不是在启动后的imeddiatly。
答案 0 :(得分:2)
您可以使用Java获取当前堆栈跟踪。您将获得一组StackTraceElement
元素。
数组中的第一项是当前正在执行的方法。
有关如何获取堆栈跟踪的信息,请参阅以下问题:
代码可能如下所示:
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
StackTraceElement yourMethod = trace[1];
System.out.println(yourMethod.getMethodName());
答案 1 :(得分:2)
调试器是可行的方法。这就是他们的目的。
具有线程支持的Java调试器内置于Eclipse和Netbeans IDE中。
答案 2 :(得分:2)
让VM转储线程(Ctrl-Break)。在列表中找到您的主题。查看最顶层的stacktrace方法。完成。
答案 3 :(得分:1)
您有两个选择:
使用debug来了解已执行的内容以及未执行的内容。
使用大量logmessages(您也可以在该消息中生成堆栈跟踪)
答案 4 :(得分:1)
线程转储是解决问题的正确方法。如果你想在进程内以某种形式进行编程(某种监视逻辑),那么java.lang.management.ThreadMXBean可以提供对所有线程及其当前堆栈的访问。
答案 5 :(得分:0)
抛出异常,立即捕获并保存堆栈。这就像要求大象飞到海外一样高效,但它有可能,因为它可以将当前的调用堆栈提取到你可以使用的东西。
但是,你确定没有碰到活锁吗?
答案 6 :(得分:0)
您认为您的网络抓取程序是在处理相同网址的循环中吗?添加一些高级日志记录,以便每个线程写入它正在处理的内容。