web-dev-qa-db-ja.com

IntelliJでマルチスレッドアプリをデバッグする方法

IntelliJ IDEA 14.0.2。ブレークポイントが停止する前に実行された後のコード。

_import Java.util.concurrent.atomic.AtomicInteger;


public class Main {

    private static final int NUM_CLIENTS = 1000;

    static class TestRunnable implements Runnable {
        AtomicInteger lock;
        @Override
        public void run() {
            synchronized (this.lock) {
                int curCounter = this.lock.addAndGet(1);
                System.out.println("Thread: " + Thread.currentThread().getName() + "; Count: " + curCounter);
                if (curCounter >= NUM_CLIENTS) {
                    lock.notifyAll();
                }
            }
        }
    }

    public static void main(final String args[]) {
        final AtomicInteger lock = new AtomicInteger(0);
        for (int i = 0; i < NUM_CLIENTS; i++) {
            TestRunnable tr1 = new TestRunnable();
            tr1.lock = lock;
            new Thread(tr1).start();
        }
        synchronized (lock) {
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Main woken up");
        }
    }
}
_

12行目にブレークポイント(すべてをサスペンド)を配置すると、synchronized (this.lock)、_System.out.println_はまだ実行されます(数回)。スクリーンショットは次のとおりです。

enter image description here

私の知る限り、すべてのスレッドはブレークポイントで停止する必要があります。

50
m0skit0

ドキュメントは混乱を招きますが、 これは関連するブロックです これは、代わりにアプリケーション全体ではなくスレッドでプロパティを一時停止するように設定することです。これにより、任意の不確定なスレッドではなく、個々のスレッドでブレークポイントに到達します。

Suspend box checked with Thread radio button selected.

  • ポリシーの一時停止:すべて
    • ブレークポイントに到達すると、すべてのスレッドが中断されます。
  • ポリシーの一時停止:スレッド
    • ブレークポイントにヒットすると、ブレークポイントにヒットしたスレッドは中断されます。
117
Makoto