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:
Autant que je sache, tous les threads doivent s'arrêter au point d'arrêt.
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é.