2013-03-28 3 views
7

Wenn ich einige Multithread Java-Code in Eclipse debuggen - mit einer Hauptklasse RunTest und eine interessante Klasse QueueListener.Wie kann man Java Testrounner in Eclipse Breakpoints depriorisieren?

Annahmen:

  • Wenn RunTest initialisiert wird - läuft QueueListener im Hintergrund.
  • Wenn RunTest finalisiert - QueueListener beendet
  • Es gibt eine einzelne Methode in RunTest ist - mit einem Haltepunkt in es
  • Es gibt eine einzige Methode in QueueListener mit einem Haltepunkt in ihm
  • QueueListener über laufen und über wieder
  • RunTest nur einmal ausgeführt wird pro Ausführung (Elternklasse)

Wenn in Eclipse Debuggen - beide Haltepunkte kommen. Aber Eclipse räumt RunTest Priorität ein - und ich muss es manuell in den QueueListener umschalten, indem ich diesen Thread im Debugger auswähle - und dies immer wieder wiederholen.

Gibt es eine Möglichkeit, Eclipse mitzuteilen, dass ich mich mehr für den QueueListener interessiere und den Testrunner als eine niedrigere Priorität ansehe - wenn er Debug-Breakpoints zum Anzeigen auswählt?

+0

Kann ich den Namen der Anwendung kennen, für die Sie debuggen? Ruft RunTest das Treiberskript im Automation Framework auf? –

Antwort

3

Die Antwort kann im Eclipse-Quellcode innerhalb der ThreadEventHandler-Methode gefunden werden. Es gibt eine Warteschlange von suspendiertem Fäden, wie unten:

/** 
* Queue of suspended threads to choose from when needing 
* to select a thread when another is resumed. Threads 
* are added in the order they suspend. 
*/ 
private Set fThreadQueue = new LinkedHashSet(); 

Weiter unten, jedesmal, wenn ein Haltepunkt erreicht ist, wird der aufgehängte Thread zu dieser Warteschlange hinzugefügt:

protected void handleSuspend(DebugEvent event) { 
    ... 
    queueSuspendedThread(event); 
    ... 
} 

das Verfahren die nächsten zu erhalten suspendiert Threads:

protected synchronized IThread getNextSuspendedThread() { 
    if (!fThreadQueue.isEmpty()) { 
     return (IThread) fThreadQueue.iterator().next(); 
    } 
    return null; 
} 

So ist die Antwort nein ist, gibt es keine Kontrolle über die Reihenfolge, es wird streng in der Reihenfolge sein, dass jeder Thread den Haltepunkt trifft und an die darunter liegende Warteschlange hinzugefügt.

+0

In der Praxis bedeutet dies, dass Ihr RunTest-Thread an der Spitze der Warteschlange steht und dort verbleibt, bis Sie ihn wieder aufnehmen. Wenn Sie also den QueueListener nach diesem Punkt fortsetzen, wird IMMER auf den RunTest-Thread zurückgesetzt –

+0

nur FIFO - fair genug. Danke für die gut recherchierte Antwort. – hawkeye

0

Es gibt keine Priorität, aber das hängt nur vom Timing-Verhalten Ihrer Anwendung ab. Wahrscheinlich werden Ihre 2 Breakpoints innerhalb kürzester Zeit getroffen, aber immer in der gleichen Reihenfolge. Und dann öffnet Eclipse immer den Editor (und scrollt zum Thread) von nur einem von ihnen (wobei ich die gewählte Strategie nicht genau kenne, aber ich würde den ersten gefundenen Breakpoint erraten).

Sie möchten nicht, dass sich Ihre Editoren/Ansichten beim Debuggen einer Multithread-Anwendung und beim Aufrufen von Haltepunkten alle paar Sekunden ändern, oder?

Verwandte Themen