it-swarm.com.de

IntelliJ-Thread-Debugging

Bietet IntelliJ IDEA Thread-Debugging? Das heißt - Netbeans ermöglicht das Debuggen mehrerer Threads und das Anhalten dieser Haltepunkte (automatisch). Alles was ich anscheinend in IntelliJ bekomme, ist "Thread Dumping". Dies scheint eine manuelle Analyse zu sein und eine Momentaufnahme, wenn ich auf "Thread Dump" klickte.

Gibt es etwas, was ich vermisse? Ich habe google'd und habe nicht genügend Informationen gefunden, um zu helfen.

17
Dane Balia

Ich glaube du kannst. Ich habe Threads über Haltepunkte angehalten, indem Sie die suspend-Richtlinie festgelegt haben. Dadurch wird der Thread angehalten, der diesen Code ausführt. Wenn Sie mehrere Threads haben, würde ich denken, dass sie weiter machen würden.

So zitieren Sie die Suspend-Richtlinie

  • Artikelbeschreibung 
  • All: Wenn der Haltepunkt erreicht ist, werden alle Threads angehalten
  • Thread: Wenn der Haltepunkt erreicht ist, wird der Thread, an dem der Haltepunkt getroffen wird, angehalten. 
  • None: Kein Thread ist ausgesetzt.
25
RNJ

Sie haben eine schöne Threads-Ansicht.

Drücken Sie das kleine Zahnrad und Sie sehen alle aktiven Fäden.

enter image description here

Für jeden Haltepunkt können Sie die Suspend-Richtlinie festlegen. Sie können entweder die Alternative Thread für alle Haltepunkte als Standard festlegen oder für jeden Haltepunkt einzeln festlegen. 

enter image description here

7
maba

Für mich stellt sich das Problem, dass der Thread nicht aufgerufen wird. Ich habe Bremspunkte für alle eingerichtet. Und fügen Sie Bremspunkte in aufrufende Methoden ein. Was mir aufgefallen ist, ist, dass auf die Methode in einem neuen Thread zugegriffen wird, wenn ich run () und nicht start () aufrufe. Ich frage mich nur, warum AFAIK die start () -Methode run () aufrufen sollte. Trotzdem tritt die Ausgabe von thread selbst dann auf, wenn ich .start () aufrufe, aber niemals darauf zugreifen.

3
Jacob

Ich denke, das Problem, das Sie haben, ist, dass die untergeordneten Threads früher geschlossen werden, als Sie erwartet hatten, da der Haupt-Thread ( der Test selbst ) bis zum Ende reicht.

Denken Sie daran, dass bei einem Thread.start () ein asynchroner Aufruf gestartet wird. Wenn Sie Ihre Tests mit Junit ausführen, wird die Ausführung nach diesem Aufruf bis zum Ende des Tests fortgesetzt, und sobald er beendet ist, wird die Ausführung ausgeführt Fährt die von Ihnen gestarteten Threads herunter.

Wenn Sie also etwas haben:

01. import org.junit.Assert;
02. import org.junit.Test;
03. public class ThreadTest {
04.     static boolean didIGetIt = false;
05.     @Test
06.     public void testThread() {
07.         Thread myThread = new Thread(new Runnable() {
08.             @Override
09.             public void run() {
10.                 System.out.println("I am an asynchronous task");
11.                 System.out.println("and JUnit won't wait for me to finish my job!");
12.                 didIGetIt = true;
13.             }
14.         });
15.         myThread.start();
16.         Assert.assertTrue(didIGetIt);
17.     }
18. }

Das Assert wird ausgeführt, bevor der Code innerhalb von run () zu einem Fehlertest führt.

Wenn Sie jedoch einen einfachen Ruhezustand hinzufügen, können Sie den Haupt-Thread und das Debugging anhalten und tun, was Sie benötigen, bevor der Haupt-Thread stoppt.

01. import org.junit.Assert;
02. import org.junit.Test;
03. public class ThreadTest {
04.     static boolean didIGetIt = false;
05.     @Test
06.     public void testThread() throws InterruptedException {
07.         Thread myThread = new Thread(new Runnable() {
08.             @Override
09.             public void run() {
10.                 System.out.println("I am an asynchronous task");
11.                 System.out.println("and JUnit won't wait for me to finish my job!");
12.                 didIGetIt = true;
13.             }
14.         });
15.         myThread.start();
16.         System.out.println("Let's wait for child threads to finish");
17.         Thread.sleep(5000);
18.         Assert.assertTrue(didIGetIt);
19.     }
20. }

Sicher gibt es bessere Möglichkeiten, aber es ist vielleicht das, was Sie suchen.

Hoffe es kann jemandem helfen!

0
Marco Vargas

Für mich bestand das Problem darin, dass es eine Racebedingung mit dem Wiederaufnehmen von Threads nach Haltepunkten und der Bewertung von Haltepunkten in IntelliJ gibt.

Kurzfristig ging es darum, Haltepunkte nicht direkt vor dem Erzeugen eines Threads festzulegen. Wenn ich dies nicht mache, werden die ersten Haltepunkte im run () oder call () verfehlt.

0
kervin