2011-04-04 80 views
1

我正在分析java中的堆棧跟蹤轉儲,不知道我怎麼能告訴哪些線程實際上正在運行。我看到一個線程的方式是運行,等待鎖定,睡眠或等待安排。java堆棧跟蹤分析,什麼線程正在運行

在我堆棧跟蹤我看到下面的狀態

java.lang.Thread.State: WAITING (on object monitor) 
java.lang.Thread.State: RUNNABLE 
java.lang.Thread.State: TIMED_WAITING (sleeping) 
java.lang.Thread.State: WAITING (parking) 
java.lang.Thread.State: TIMED_WAITING (parking) 

一是究竟是什麼這些狀態是什麼意思?其次,我有11個可運行的線程,其中兩個正在等待一個條件。這是否意味着9個線程同時運行?這似乎不可能,因爲我的機器沒有那麼多的內核?

回答

5

術語Runnable可能並不意味着「正在運行」,而是「處於運行狀態」。您所遇到的差異是,在任何給定時間可以運行的最大線程數等於您的內核數。

要更詳細地瞭解您需要知道其他兩個是什麼意思。 WAITING意味着一個線程被暫停在某個對象上。

while(<condition holds>) 
    obj.wait() 

在這裏,當前線程當前正在WAITING obj的監視器上。這將迫使該線程暫停,在該線程中OS可以安排另一個線程運行。 TIMED_WAITING只是暫停一段時間的線程。

所以,如果一個線程不是wait ing或sleep ing它被認爲是run ning。

從文檔中提供更多見解。

可運行線程的線程狀態。 A 處於可運行狀態的線程是在Java虛擬機 中執行的 ,但它可能正在等待來自操作系統 (如處理器)的其他 資源。

最後一部分是我認爲你正在尋找的東西。物理上OS不能並行運行更多的線程,然後有內核。所有9個線程可以同時運行,但只有n個並行運行(n是內核數量)。

類似的是Condition.await

編輯真:

對不起richs - Shoudlve掛我的資源http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.State.html#RUNNABLE

+0

您可以在可運行線程上獲得該語句的位置。它來自java語言規範嗎? – richs 2011-04-04 20:32:31

+0

@richs我用鏈接編輯。 – 2011-04-04 20:37:22

0

看看這個頁面可以幫助您 http://download.oracle.com/javase/6/docs/api/java/lang/Thread.State.html

要獲得關於核VS線程數的第二個問題。一個內核可以同時運行多個線程。因此#threads =#cores

來自每個線程的完整堆棧會讓您更好地理解每個人正在做什麼。如果在申請中目前沒有工作,許多人將處於等待狀態,閱讀以接受下一份工作。

+0

我的印象是,這樣的單核機器輯陣線程是通過時間切片。 – richs 2011-04-04 20:20:01

+0

多個線程在同一個JVM中運行。有關內部工作原理的更多信息,請參閱Oracle網站上的文檔 – Sean 2011-04-04 20:21:09