2012-07-13 74 views
0

我想在web應用程序中找到線程問題的底部。我正在使用Eclipse。問題是當一個線程在一段非常冗長的代碼段中處於特定階段時,即使它應該,另一個線程也不能再進一步。它具有堵塞螺紋的外觀。 Eclipse將其標記爲「步進」。由於在代碼附近沒有監視器,信號量和sychnronization塊,所以它停止了是沒有意義的。試圖理解爲什麼一個線程可能在日食中被阻塞?

我可以在eclipse中使用任何東西來理解線程看起來像被阻塞的任何原因嗎?

我可以按暫停按鈕,暫停線程。當我點擊恢復按鈕,它會回到「步進」,但不能完成這個簡單的代碼行:

long beginTime = System.currentTimeMillis(); 

謝謝。

+0

聽起來像你正在調試你的程序,它已經到達了一個斷點。 – Gray 2012-07-13 16:46:00

+0

我將陳述明顯的(當我寫這篇文章的時候):你在調用System.currentTimeMillis()時阻塞。這會訪問操作系統,因此問題可能出在JVM甚至Eclipse之外。檢查你的冗長代碼是否有可疑的操作系統訪問。其他微弱的可能性:線程正在等待覈心免費。 (我發現一旦WinXP開始啓動,操作系統不會破壞它,如果你有舊的操作系統,並且只有一個內核......) – RalphChapin 2012-07-13 19:47:25

回答

1

「Stepping」的聲音聽起來像Eclipse認爲你是「單步執行代碼」並且目前在那一行 - 也就是說,你正在Debug模式下運行。有沒有在你錯過的地方設置斷點?

+0

我已經刪除了所有斷點,但重新創建此問題所需的斷點除外。 – dublintech 2012-07-13 17:06:15

+0

如果你還刪除了最後一個斷點,代碼是否超過'beginTime'行?如果以Run(而不是Debug)模式運行,會怎麼樣? – 2012-07-13 17:19:19

1

在Eclipse中,將一個線程標記爲「Stepping」意味着您正在逐步執行代碼,無論是採用分步還是更有可能的切換,並且線程都會以某種方式阻塞某個IO,等待一個同步鎖,調用wait()等。Eclipse不控制線程,並且正在等待線程移動通過該塊,然後才能繼續執行「步進」。一旦Eclipse控制了下一行的線程,您的線程就會變爲「暫停」。

例如,在調試以下測試代碼:

// i put a break point here 
System.out.println("Foo"); 
Object lock = new Object(); 
synchronized (lock) { 
    // when I step over this line, my thread is labeled as "Stepping" 
    lock.wait(); 
} 
System.out.println("Boo"); 

一旦我跨過一個其阻斷螺紋的方法,該線程被標記爲「步進」。

enter image description here

+0

另一個線程「暫停」並具有暫停圖標。這是問題場景中的第一個線程。當這個線程處於某個特定階段時,即使eclipse已經標記爲「步進」,另一個線程也會被阻塞。 – dublintech 2012-07-13 17:08:24

+0

我編輯了我的答案@dublintech。我懷疑,「步進」是當你踏入或者(更可能)跨過阻塞線程的方法。 – Gray 2012-07-13 17:29:52

相關問題