1

在尝试调试多线程程序时,我遇到了一个新问题。下面,我包含了一个测试程序来演示我的问题。本质上,当我在对线程的 start() 方法以及该线程的 run() 方法的调用上设置断点时,如果我在调试器中“继续”,一切都会好起来的。但是,如果我跳过,我可以跳过对 start()、println() 和 join() 的调用,之后程序会等待执行完成,但这永远不会发生。线程似乎没有执行,我在线程的 run() 中的断点从不跳闸。我必须退出程序。

现在,如果 run() 上没有断点,我继续还是单步都没有关系;线程执行。我在这里想念什么?

请注意,我正在使用 vanilla eclipse 调试。

public class Test {
    public static void main(String[] args) {
        try {
            Thread myThread = new Test().new TestThread();
            long threadStartTime = System.currentTimeMillis();
            myThread.start(); // **********Breakpoint 1
            System.out.println("Thread started");
            myThread.join();
            long threadExecutionTime = System.currentTimeMillis() - threadStartTime;
            System.out.println("Thread finished execution in " + threadExecutionTime + " milliseconds.");
        } catch(InterruptedException e) {
            System.err.println(e.getMessage());
        }
    }

    private class TestThread extends Thread {
        @Override
        public void run() { // **********Breakpoint 2
            try {
                sleep(5*1000);
            } catch(InterruptedException e) {
                System.err.println(e.getMessage());
            }
        }
    }
}
4

2 回答 2

3

如果您使用 eclipse 进行调试,您应该在调试窗口中看到线程列表。从那里选择另一个线程的堆栈跟踪,您也应该能够调试运行方法。

于 2012-05-30T14:03:32.327 回答
3

你确定断点run()没有被绊倒吗?在 Eclipse 中,您需要单击第二个线程才能看到它已暂停。我怀疑线程已经启动但正在等待你说继续。

我怀疑如果您没有断点,run()那么跨步start()将可以正常工作。它是第二个断点,它阻止了另一个线程并阻止它运行sleep()或返回到join().

在下图中,您可以看到我跳过了该start()方法并Thread-1已启动。但它已暂停(请参阅黄色暂停条)等待您切换到它并继续。

在此处输入图像描述

于 2012-05-30T14:03:35.977 回答