2015-01-05 13 views
30

Ich habe ein seltsames Problem mit mehreren Threads und Breakpoints in IntelliJ IDEA 14.0.2. Der Code nach dem Haltepunkt wird ausgeführt, bevor er angehalten wird.Wie Debuggen einer Multi-Thread-App in IntelliJ?

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 einen Haltepunkt in Zeile 12 (Alle Suspend), synchronized (this.lock) führt System.out.println noch (manchmal mehrmals). Hier ist ein Screenshot:

enter image description here

Soweit ich weiß, alle Threads an dem Haltepunkt stoppen sollte.

+0

was ist Zeile 12? –

+2

Was ist, wenn Sie den Haltepunkt an der Linie 14 setzen? (println) – Raffaele

+1

Ich könnte Ihnen versichern, dass * einer * der Threads gestoppt hat ... welcher ist unbestimmt. – Makoto

Antwort

72

Die Dokumentation liest verwirrend, aber this is the relevant block. Was es destilliert, ist das Festlegen der Eigenschaft auf Threads auszusetzen, und nicht die gesamte Anwendung statt. Dies wird dazu führen, dass Sie den Unterbrechungspunkt auf jedem einzelnen Thread statt eines beliebigen, unbestimmten Threads treffen.

Suspend box checked with Thread radio button selected.

  • Politik Suspend-Modus: Alle
    • Wenn ein Haltepunkt erreicht ist, werden alle Fäden aufgehängt.
  • Suspend-Politik: Thread
    • Wenn der Haltepunkt erreicht wird, der Thread, in dem der Haltepunkt erreicht wird, ausgesetzt.
+1

Eigentlich möchte ich alle Threads aussetzen, wenn einer den Haltepunkt erreicht. Genau wie Eclipse. Ich denke, das ist nicht möglich? – m0skit0

+8

In der Tat Dokumentation heißt: "Alle - Wenn ein Haltepunkt getroffen wird, sind alle Threads ausgesetzt". Das ist genau das Verhalten, das ich will. Problem ist, dass einige Threads manchmal weiter ausgeführt werden, nachdem der Breakpoint getroffen wurde, vielleicht, wenn IDEA den ersten Thread stoppt, um den Breakpoint zu treffen. Ich denke, das ist einfach ein Bug auf IDEA Debugger oder JVM. Sie sollten zumindest das Verhalten auf der Dokumentation klären, weil es einfach falsch ist, nicht verwirrend. – m0skit0

+0

Wie auch immer, deine Lösung funktioniert jetzt für mich, vielen Dank. – m0skit0

Verwandte Themen