如何在Eclipse断点中优化Java testrunner?

时间:2013-03-28 12:37:55

标签: java eclipse multithreading thread-priority

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

假设:

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

在调试多线程应用程序并每隔几秒钟点击一次断点时,你真的不想让你的编辑器/视图一直在变化,或者你呢?