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 で [ステップ イン] をクリックすると、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 で「ステップ イン」をクリックすると、run() メソッドではなく、[Thread.start() メソッド] に移動し、方法がありません。私のコードで run() に行きます。

これは予想されることであり、Eclipse の問題ではありません。スレッドがフォークされて実行が開始されたときに実行されているネイティブ メソッドにデバッグすることはできません。

これをデバッグする方法は?

メソッドの最初の行にブレークポイントを置きますrun()。または、必要に応じてThread.run()run()メソッドが呼び出されるメソッドにブレークポイントを配置できます。

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

注:この種のプログラムをデバッグすると、スレッドの実行順序が大幅に変更されることを理解する必要があります。呼び出しはIO を生成し、基になるものはSystem.out.println()であるため、これも同様に行います。これは、print ステートメントとブレークポイントを削除すると、プログラムの動作が大きく変わることを意味します。PrintStreamsynchronized

于 2013-04-13T19:05:25.700 に答える
2

start()ありませんrun()

にブレークポイントを設定する必要がありますrun()。次に、アプリを実行すると、Eclipse は run() にとどまります。

デバッグ ビューでは、2 つのスレッドが表示されます。

ブレークポイントも設定することを忘れないでくださいa.join();

于 2013-04-13T19:08:20.117 に答える