7

如果我在 Eclipse 中调试一些多线程 Java 代码 - 使用主类 RunTest 和一个有趣的类 QueueListener。

假设:

  • 初始化 RunTest 时 - QueueListener 在后台运行。
  • 当 RunTest 完成时 - QueueListener 被终止
  • RunTest 中只有一个方法——其中有一个断点
  • QueueListener 中有一个方法,其中有一个断点
  • QueueListener 可以反复运行
  • RunTest 每次执行只运行一次(父类)

在 Eclipse 中调试时 - 两个断点都会出现。但是 Eclipse 优先考虑 RunTest - 我必须通过在调试器中选择该线程来手动将其翻转到 QueueListener - 并一遍又一遍地重复这一点。

有没有办法告诉 Eclipse 我对 QueueListener 更感兴趣,并认为 testrunner 的优先级较低——当它选择要显示的调试断点时?

4

2 回答 2

3

答案可以在 eclipse 源代码中的ThreadEventHandler方法中找到。有一个挂起的线程队列,如下所示:

/**
 * Queue of suspended threads to choose from when needing
 * to select a thread when another is resumed. Threads
 * are added in the order they suspend.
 */
private Set fThreadQueue = new LinkedHashSet();

再往下,每次遇到断点,挂起的线程就会被添加到这个队列中:

protected void handleSuspend(DebugEvent event) {
   ...
   queueSuspendedThread(event);
   ...
}

获取下一个挂起线程的方法是:

protected synchronized IThread getNextSuspendedThread() {
    if (!fThreadQueue.isEmpty()) {
        return (IThread) fThreadQueue.iterator().next();
    }
    return null;
}

所以答案是否定的,没有对顺序的控制,它将严格按照每个线程命中断点并添加到底层队列的顺序。

于 2013-03-28T13:40:02.720 回答
0

不涉及优先级,但这仅取决于应用程序的时序行为。可能您的 2 个断点会在很短的时间内被击中,但总是以相同的顺序。然后 Eclipse 将始终只打开其中一个的编辑器(并滚动到线程)(我不完全知道选择的策略,但我猜是发生的第一个断点)。

在调试多线程应用程序并每隔几秒打断点时,您真的不想让您的编辑器/视图一直更改,对吗?

于 2013-03-28T13:27:34.980 回答