web-dev-qa-db-fra.com

Comment déboguer une application multi-thread dans IntelliJ?

J'ai un problème étrange avec plusieurs threads et points d'arrêt dans IntelliJ IDEA 14.0.2. Code après l'exécution du point d'arrêt avant qu'il ne s'arrête dessus.

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

Lorsque je mets un point d'arrêt (Suspend All) à la ligne 12, synchronized (this.lock), System.out.println Est toujours exécuté (parfois plusieurs fois). Voici une capture d'écran:

enter image description here

Autant que je sache, tous les threads doivent s'arrêter au point d'arrêt.

50
m0skit0

La documentation est source de confusion, mais il s’agit du bloc pertinent. Ce qu’elle résume est la définition de la propriété pour suspendre les threads, et non l’application entière. Cela vous fera atteindre le point de rupture sur chaque thread individuel au lieu d'un thread arbitraire et indéterminé.

Suspend box checked with Thread radio button selected.

  • Politique de suspension: Tous
    • Lorsqu'un point d'arrêt est atteint, tous les threads sont suspendus.
  • Politique de suspension: thread
    • Lorsque le point d'arrêt est atteint, le thread sur lequel le point d'arrêt est atteint est suspendu.
117
Makoto