在Java中,它';s可能发现当前执行的方法是什么?

在Java中,它';s可能发现当前执行的方法是什么?,java,multithreading,methods,Java,Multithreading,Methods,我正在使用线程,但过了一段时间,大多数线程都停止了工作。我想到的第一件事是死锁,但都是状态运行 我想我的逻辑中有一个错误或一个我没有意识到的新特性,我必须处理(这是一个网络绘图程序) 是否可以获取当前执行的方法或操作?我想看看我的线程被困在哪里 编辑:我认为这是我需要处理的事情,或者我的逻辑中有错误,因为这是在执行一段时间后发生的,而不是在启动后发生的。您有两个选项: 使用debug来了解执行了什么以及没有执行什么 使用大量日志消息(也可以在该消息中生成堆栈跟踪) 也就是说,抛出一个异常,立即捕

我正在使用线程,但过了一段时间,大多数线程都停止了工作。我想到的第一件事是死锁,但都是状态运行

我想我的逻辑中有一个错误或一个我没有意识到的新特性,我必须处理(这是一个网络绘图程序)

是否可以获取当前执行的方法或操作?我想看看我的线程被困在哪里

编辑:我认为这是我需要处理的事情,或者我的逻辑中有错误,因为这是在执行一段时间后发生的,而不是在启动后发生的。

您有两个选项:

  • 使用debug来了解执行了什么以及没有执行什么

  • 使用大量日志消息(也可以在该消息中生成堆栈跟踪)


  • 也就是说,抛出一个异常,立即捕获它并保存堆栈。这与让大象飞到海外差不多,但这是可能的,因为它可以将当前的调用堆栈提取到您可以使用的东西


    但是,您确定没有遇到livelock吗?

    您可以在Java中获得当前堆栈跟踪。您将获得一个
    stackTraceeElement
    元素数组

    数组中的第一项是当前正在执行的方法

    有关如何获取堆栈跟踪,请参见以下问题:

    代码可能如下所示:

    StackTraceElement[] trace = Thread.currentThread().getStackTrace();
    StackTraceElement yourMethod = trace[1];
    System.out.println(yourMethod.getMethodName());
    

    调试器是一种方法。这就是它们的设计目的



    Eclipse和Netbeans IDE中都内置了支持线程的Java调试器。

    使VM转储线程(Ctrl-Break)。在列表中找到你的线程。请看最上面的stacktrace方法。完成。

    您是否认为您的网络爬虫程序正在循环处理相同的URL。添加一些高级日志记录,以便每个线程都写入它正在处理的内容。

    线程转储是解决此问题的正确方法。如果您希望在流程中以编程方式执行此操作(某种监视逻辑),则java.lang.management.ThreadMXBean提供对所有线程及其当前堆栈的访问。

    您不需要抛出异常。您可以创建一个新的异常并使用它来获取堆栈跟踪。或者你可以看到我的答案。我想你实际上是在寻找一个调试器。这可能很简单,但取决于您的IDE。是的,目前我正在使用Netbeans的调试器,但我不知道如何查看每个线程当前执行的方法。我不使用Netbeans,但它应该在某个地方有活动线程的列表。是的,我可以看到线程,因为我也知道它们正在运行,而不是处于死锁状态。我发现了如何在调试器中查看执行堆栈。我将进行测试以确认错误是否在执行堆栈指向的位置。有一个很棒的工具,名为jstack(来自JDK)。除此之外,Thread.getAllStackTraces()是一些好东西。还有一种方法可以获取调用方类(作为引用而不仅仅是字符串,最简单的方法是扩展SecurityManager)+1:除非您希望元素[1],因为元素[0]本身就是getStackTrace()@彼得,哎呀,谢谢。我没有注意到我把它搞砸了。我不能停下来,但想知道当前线程的堆栈跟踪如何帮助识别其他卡住的线程的问题?为了记录当前线程位置堆栈跟踪是不必要的,只需转储一些唯一的标记,即“at user login#1”。我有一个引擎线程,它可以执行关键工作。我有另一个线程来监视它,如果它需要太长的时间来完成工作,我会记录一个堆栈跟踪,这样我就可以找出随机延迟及其原因。当前线程的堆栈是一个很简单的操作
    Thread.currentThread().getStackTrace()
    equals
    new Exception().getStackTrack()
    ,Thread.getStackTrace仅对当前运行的线程是必需的,它们必须达到某个“安全点”,VM才能要求它们收集它们的statck。我正在登录我的程序。循环处理不会发生。我现在检查错误。我怀疑HttpUrlConnection.getInputStream或下载后安装HTML解析器时出现了错误,但这不是我的类,是java本机和外部库。我在Netbeans调试器的stacktrace中发现了这一点。+1:线程转储是一种方法。您甚至可以重复执行线程转储,并查看所有线程中(最上面的)线程的变化情况。您不需要调试程序,jstack可以打印任何正在运行的java进程的堆栈(并在没有任何调试选项的情况下启动)@bestss:这将允许您随时间跟踪变量值,确定线程为何进入其所在的帧?调试器给了你更多的权力,而OP正试图调试一个问题。显然,我并不是在争论调试器的用途。调试器有其目的,尽管到目前为止,它们对调试并发代码没有多大帮助。您不在调试模式下运行生产流程,但可以改为运行jstack。使用内存快照库(jmap)是一种选择,但它可能会阻塞应用程序太长时间。旁注:如果你有大量(200多个)线程,特别是远程调试,eclipse中的调试器会很糟糕。好消息是,我发现这些方法停止使用Netbeans调试器。坏消息是,我不知道如何解决,但我后来看到了这一点。是socketRead0中的一个问题。