2013-03-28 6 views
7

Jeśli debuguję jakiś wielowątkowy kod Java w środowisku Eclipse - z klasą RunTest klasy głównej i interesującą klasą QueueListener.Jak odłączyć program testowy Java w punktach przerwania Eclipse?

Założenia:

  • Kiedy RunTest jest inicjowany - QueueListener działa w tle.
  • Kiedy RunTest finalizuje - QueueListener jest zakończony
  • Istnieje jeden sposób w RunTest - z przerwania w to
  • Istnieje jeden sposób w QueueListener z przerwania w nim
  • QueueListener można uruchomić w kółko ponownie
  • RunTest działa tylko raz na wykonanie (klasa dominująca)

Podczas debugowania w Eclipse - obie wartości graniczne wymyślić. Ale Eclipse daje pierwszeństwo RunTest - i muszę ręcznie przerzucić go do QueueListener, wybierając ten wątek w debugerze - i powtarzać to w kółko.

Czy istnieje sposób, aby powiedzieć Eclipse, że jestem bardziej zainteresowany QueueListener i uważam, że testrunner ma niższy priorytet - kiedy wybiera debugujące punkty przerwania do wyświetlenia?

+0

Czy mogę znać nazwę aplikacji, dla której debugujesz? Czy RunTest nazwał drivercript w AutomationFramework? –

Odpowiedz

3

Odpowiedź można znaleźć w kodzie źródłowym programu Eclipse w metodzie ThreadEventHandler. Jest kolejka zawieszonych wątków, jak poniżej:

/** 
* 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(); 

Dalej w dół, za każdym razem, gdy punkt przerwania jest trafiony, zawieszony wątek dodano do tej kolejki:

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

Sposób zdobycia następnego zawieszony wątek jest:

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

Więc odpowiedź brzmi: nie, nie ma kontroli nad celem, będzie ściśle być w porządku, że każdy wątek trafia w pułapkę i jest dodawany do kolejki bazowego.

+0

W praktyce oznacza to, że gdy wątek RunTest znajduje się na czele kolejki, pozostanie w nim do momentu jego wznowienia, więc po wznowieniu każdego z QueueListener po tym punkcie ZAWSZE powróci do wątku RunTest –

+0

. tylko FIFO - wystarczy. Dzięki za dobrze zbadaną odpowiedź. – hawkeye

0

Nie ma żadnego priorytetu, ale zależy to tylko od czasu działania aplikacji. Prawdopodobnie twoje 2 punkty przerwania są trafione w bardzo krótkim czasie, ale zawsze w tej samej kolejności. A następnie zaćmienie zawsze otworzy edytor (i przewiń do wątku) tylko jednego z nich (gdzie dokładnie nie znam wybranej strategii, ale domyślam się, że pojawił się pierwszy punkt przełomowy).

Naprawdę nie chcesz, aby twoje edytory/widoki były cały czas zmieniane podczas debugowania aplikacji wielowątkowej i trafiania punktami przerwania co kilka sekund, czy też?

Powiązane problemy