java - ¿Cómo depurar una aplicación multihilo en IntelliJ?
multithreading debugging (1)
La documentación es confusa, pero este es el bloque relevante. Lo que se traduce en establecer la propiedad es suspender en los hilos, y no toda la aplicación en su lugar. Esto hará que llegue al punto de ruptura en cada hebra individual en lugar de un hilo arbitrario e indeterminado.
- Política de suspensión: todos
- Cuando se golpea un punto de interrupción, todos los hilos se suspenden.
- Suspender la política: hilo
- Cuando se golpea el punto de interrupción, el hilo donde se golpea el punto de interrupción se suspende.
Tengo un problema extraño con varios subprocesos y puntos de interrupción en IntelliJ IDEA 14.0.2. Código después de que se ejecuta el punto de interrupción antes de detenerse en él.
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");
}
}
}
Cuando pongo un punto de interrupción (Suspender todo) en la línea 12, synchronized (this.lock)
, System.out.println
todavía se ejecuta (a veces varias veces). Aquí hay una captura de pantalla:
Hasta donde yo sé, todos los hilos deberían detenerse en el punto de ruptura.