2013-03-28 58 views
7

如果我正在Eclipse中調試一些多線程Java代碼 - 包含一個主類RunTest和一個有趣的類QueueListener。如何在Eclipse斷點中優先考慮Java testrunner?

假設:

  • 當的runTest初始化 - QueueListener在後臺運行。
  • 當的runTest定型 - QueueListener終止
  • 有在的runTest一個單一的方法 - 在斷點它
  • 有在QueueListener一個方法在它斷點
  • QueueListener可以反覆運行再次
  • 的runTest只執行每一次運行(父類)

當在Eclipse中調試 - 這兩個斷點上來。但Eclipse優先考慮RunTest - 我必須通過在調試器中選擇該線程來手動將其轉換到QueueListener,並不斷重複此操作。

有沒有辦法告訴Eclipse我對QueueListener更感興趣,並認爲testrunner的優先級較低 - 當它選擇調試斷點來顯示?

+0

我可以知道您正在調試的應用程序的名稱嗎? RunTest是否在AutomationFramework中調用了驅動程序? –

回答

3

答案可以在ThreadEventHandler方法中的eclipse源代碼中找到。有暫停的線程隊列,如下圖所示:

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

再往下,每次命中斷點時,掛起的線程加入到這個隊列:

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

獲得下一個方法暫停的線程是:

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

所以答案是否定的,那邊訂單無法控制,將嚴格在每個線程遇到斷點,並添加到底層隊列的順序。

+0

實際上,這實際上意味着一旦你的RunTest線程在隊列的頭部,它將一直保持在那裏,直到你恢復它,所以通過在這一點之後恢復每個QueueListener,它總是會恢復到你的RunTest線程 –

+0

因此它只是FIFO - 足夠公平。感謝經過深入研究的答案。 – hawkeye

0

沒有優先級涉及,但這取決於您的應用程序的計時行爲。可能你的2個斷點在很短的時間內被擊中,但總是以相同的順序。然後eclipse會一直打開其中的一個編輯器(並且滾動到線程)(我不完全知道所選擇的策略,但我會猜測發生的第一個斷點)。

在調試多線程應用程序並每隔幾秒鐘觸擊一次斷點時,您是否真的不希望讓您的編輯器/視圖始終發生更改?