【问题标题】:In run method, how to find from where start was called?在 run 方法中,如何找到调用 start 的位置?
【发布时间】:2016-01-20 16:27:18
【问题描述】:

我正在调试一些代码。我的调试器显示代码的来源来自 Thread.run()。我需要知道从代码的哪一部分调用了 Thread.start() !有没有办法找出来?

【问题讨论】:

  • 你使用的是哪个 ide?​​span>
  • 使用 Eclipse Sir.. 但我猜 JVM 需要提供某种支持.. 也许一些 VM arg (?)
  • 如果您的应用程序中没有太多线程,您还可以在 Thread.start() 上设置断点并评估其他变量以判断它是否是正在启动的正确线程。

标签: java multithreading


【解决方案1】:

您可以使用new Throwable().getStackTrace() 获取完整的堆栈跟踪。要获得start 堆栈,您必须扩展Thread,这是实际需要这样做的少数几次之一(首选使用Runnable)。

class C extends Thread {
    StackTraceElement[] constructed;
    StackTraceElement[] started;

    public C() {
        constructed = new Throwable().getStackTrace();
    }

    @Override
    public void run() {
        // Your suuff.
    }

    @Override
    public synchronized void start() {
        started = new Throwable().getStackTrace();
        super.start();
    }

}

【讨论】:

    【解决方案2】:

    我发现了一种使用 Eclipse 或任何其他 IDE 的粗略而有效的技术。假设您的 Runnable 或 Callable 中有一个断点,并且线程在那里暂停...没有双重人无法立即确定从哪里调用 start...但是,只需右键单击 Runnable/可调用构造函数并单击“显示调用层次结构”..就是这样!!你会知道 Runnable/Callable 是在哪里构造的......然后立即调用 start!
    在 Eclipse 中,如果 Runnable/Callable 没有无参数构造函数,请右键单击类名并选择“显示调用层次结构”.. 问题解决了.. 真是松了一口气。

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      相关资源
      最近更新 更多