it-swarm.com.de

Wie debugge ich eine Multithread-App in IntelliJ?

Ich habe ein seltsames Problem mit mehreren Threads und Haltepunkten in IntelliJ IDEA= 14.0.2. Code, nachdem der Haltepunkt ausgeführt wurde, bevor er anhält.

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");
        }
    }
}

Wenn ich in Zeile 12 einen Haltepunkt (Suspend All) setze, wird synchronized (this.lock), System.out.println Immer noch ausgeführt (manchmal mehrmals). Hier ist ein Screenshot:

enter image description here

Soweit ich weiß, sollten alle Threads am Haltepunkt anhalten.

50
m0skit0

Die Dokumentation liest sich verwirrend, aber dies ist der relevante Block. Es wird lediglich festgelegt, dass die Eigenschaft an Threads und nicht an der gesamten Anwendung angehalten wird. Dies führt dazu, dass Sie anstelle eines willkürlichen, unbestimmten Threads den Haltepunkt für jeden einzelnen Thread treffen.

Suspend box checked with Thread radio button selected.

  • Richtlinie aussetzen: Alle
    • Wenn ein Haltepunkt erreicht wird, werden alle Threads angehalten.
  • Richtlinie aussetzen: Thread
    • Wenn der Haltepunkt erreicht wird, wird der Thread, in dem der Haltepunkt erreicht wird, angehalten.
117
Makoto