0

如何调试这个?我知道这不是线程安全的,但只是想跟踪逻辑。

class Test {
public static int count = 0;
class CountThread extends Thread {

    public void run()
    {
        System.out.println(Thread.currentThread().getName() + " start");
        count++;
        System.out.println(Thread.currentThread().getName() + " end");
    }
}  

public void add(){
    CountThread a = new CountThread();
    CountThread b = new CountThread();

            a.start();
    b.start();

            try {
        a.join();
        b.join();
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }

}
public static void main(String[] args) {

    Test test = new Test();
    System.out.println("START = " + Test.count);

            test.add();

            System.out.println("END: Account balance = " + Test.count);
}

当它执行到a.start()时,在Eclipse中我点击“step into”,它不会去run()方法,而是去下面,在我的代码中没有办法去run() . 如何调试这个?

     public synchronized void start() {
    /**
 * This method is not invoked for the main method thread or "system"
 * group threads created/set up by the VM. Any new functionality added 
 * to this method in the future may have to also be added to the VM.
 *
 * A zero status value corresponds to state "NEW".
     */
    if (threadStatus != 0 || this != me)
        throw new IllegalThreadStateException();
    group.add(this);
    start0();
    if (stopBeforeStart) {
    stop0(throwableFromStop);
}
}
4

2 回答 2

3

执行到a.start()时,在Eclipse中点击“step into”,并没有进入run()方法,而是进入[Thread.start()方法],没有办法在我的代码中运行()。

这是意料之中的,Eclipse 没有问题。当线程被派生并开始执行时,您无法调试正在执行的本机方法。

如何调试这个?

run()我会在你方法的第一行设置一个断点。Thread.run()或者,如果必须,您可以在调用方法的方法中放置一个断点run()

// the Thread.run() method
public void run() {
    if (target != null) {
        // Your `CountThread` objects are the `target`.
        target.run();
    }
}

注意:您需要了解此类程序的任何调试都会极大地改变线程的执行顺序。这些System.out.println()调用也这样做,因为它们产生 IO 并且底层PrintStreamsynchronized. 这意味着一旦你删除了 print 语句和断点,你的程序就会表现得非常不同。

于 2013-04-13T19:05:25.700 回答
2

start()不是run()

您需要在run(). 然后,运行应用程序,eclipse 将停留在 run() 中。

在调试视图中,您将看到两个线程。

不要忘记设置断点a.join();

于 2013-04-13T19:08:20.117 回答