2010-03-14 52 views

回答

0

如果某個方法正在等待同步對象,它應該永遠不會死亡,但如果出現錯誤,它可能會等待很長時間(如在「永遠」中)。也許你的程序永遠不會釋放對資源的鎖定?

+0

謝謝,我不認爲*有任何死鎖,但這可能是原因.. – MalcomTucker 2010-03-14 15:34:20

4

JLS沒有爲​​部分指定任何超時。它只是提到

雖然執行的線程擁有 鎖,沒有其他線程可以獲取 鎖。

4

您可以在join()方法上設置超時以確保您不會永遠等待。

我會看看java.util.concurrent包,看看是否添加了新的功能來幫助你的情況。

我還推薦Brian Goetz的「Java Concurrency In Practice」。 (我需要自己重新讀一遍。)

+1

好點:還值得注意的是,術語「死鎖」意味着兩個線程正在等待對方。如果發生超時,「死鎖」這個詞就不存在了。 – Pindatjuh 2010-03-14 15:38:06

+0

duffymo - 如果一個線程啓動另一個線程,第二個線程不得不向第一個線程報告進度,但第一個線程在第二個線程完成之前死亡,那麼您會期望發生什麼? – MalcomTucker 2010-03-14 16:15:12

+0

我不知道。這聽起來像是需要雙向溝通,但事實並非如此。你需要在這裏回調。這就是爲什麼我建議超越原始java.lang.Thread並查看java.util.concurrent包,因爲有可能適用的新功能。 – duffymo 2010-03-14 16:32:10

0

Java中的線程不會突然死掉。或者它們沒有進展(在一個鎖或者無限循環或者類似的環境中被阻塞),或者如果一個異常被拋出並且沒有被處理,那麼當異常傳播到頂層時它將停止執行(然後應該打印異常堆棧跟蹤到System.err)。

如果您的應用程序死鎖,找出原因的一種方法是進行線程轉儲。 JVM也可以自己檢測簡單的死鎖,在這種情況下,它會在線程轉儲中報告它們。

您可以在Linux下通過在控制檯窗口中運行kill -QUIT <pid>和Windows下的命令Ctrl + Break來生成線程轉儲。甚至更簡單,請使用VisualVM,StackTrace或類似的工具。

0

我建議你使用kill -3來查看線程轉儲,然後查看有問題的線程是什麼。