在Java中等待同步方法的線程是否有默認超時?我的應用程序中的某些線程未按預期完成。無論如何檢查線程是否因超時而死亡?在Java中等待同步方法的線程是否有超時?
回答
如果某個方法正在等待同步對象,它應該永遠不會死亡,但如果出現錯誤,它可能會等待很長時間(如在「永遠」中)。也許你的程序永遠不會釋放對資源的鎖定?
JLS沒有爲部分指定任何超時。它只是提到
雖然執行的線程擁有 鎖,沒有其他線程可以獲取 鎖。
您可以在join()方法上設置超時以確保您不會永遠等待。
我會看看java.util.concurrent包,看看是否添加了新的功能來幫助你的情況。
我還推薦Brian Goetz的「Java Concurrency In Practice」。 (我需要自己重新讀一遍。)
好點:還值得注意的是,術語「死鎖」意味着兩個線程正在等待對方。如果發生超時,「死鎖」這個詞就不存在了。 – Pindatjuh 2010-03-14 15:38:06
duffymo - 如果一個線程啓動另一個線程,第二個線程不得不向第一個線程報告進度,但第一個線程在第二個線程完成之前死亡,那麼您會期望發生什麼? – MalcomTucker 2010-03-14 16:15:12
我不知道。這聽起來像是需要雙向溝通,但事實並非如此。你需要在這裏回調。這就是爲什麼我建議超越原始java.lang.Thread並查看java.util.concurrent包,因爲有可能適用的新功能。 – duffymo 2010-03-14 16:32:10
Java中的線程不會突然死掉。或者它們沒有進展(在一個鎖或者無限循環或者類似的環境中被阻塞),或者如果一個異常被拋出並且沒有被處理,那麼當異常傳播到頂層時它將停止執行(然後應該打印異常堆棧跟蹤到System.err)。
如果您的應用程序死鎖,找出原因的一種方法是進行線程轉儲。 JVM也可以自己檢測簡單的死鎖,在這種情況下,它會在線程轉儲中報告它們。
您可以在Linux下通過在控制檯窗口中運行kill -QUIT <pid>
和Windows下的命令Ctrl + Break
來生成線程轉儲。甚至更簡單,請使用VisualVM,StackTrace或類似的工具。
我建議你使用kill -3來查看線程轉儲,然後查看有問題的線程是什麼。
- 1. 等待同步異步方法在同一線程上完成
- 2. 線程等待/異步有多不同?
- 3. 同步一個方法不同的Sidekiq線程並等待
- 4. 等待/異步 - 異步方法在主線程中運行
- 5. 等待vs無等待同步方法(java)
- 6. XmlPullParser同步:線程正在等待
- 7. java線程睡眠解決方案和等待同步塊
- 8. 方法超時而不是等待
- 9. java - 從等待裏面同步調用同步方法
- 10. 異步等待超時
- 11. C#線程同步(等待執行)
- 12. 如何在一個線程中等待異步方法?
- 13. 同步方法,而使用的等待()
- 14. java等待池中的所有線程
- 15. 等待一個同步方法,其中調用異步方法
- 16. 忽略CasperJS中的等待步超時
- 17. 等待不釋放異步方法中的調用線程
- 18. Java偵聽器在同步期間是否等待或丟棄?
- 19. 異步/等待與線程
- 20. 多線程:阻塞等待超時
- 21. 方法上的Java線程同步
- 22. 線程是否在鎖FIFO上等待?
- 23. 是否與調用者在同一個線程中運行異步/等待方法?
- 24. C#同步等待/輪詢方法
- 25. 角2等待同步方法
- 26. 異步/等待只有多線程?
- 27. 同步方法是否在UI線程(Android)的不同線程上運行?
- 28. 是否有可能要等待所有的線程在JMeter的
- 29. 裹同步方法成一個異步一個可「等待」時
- 30. 在java中的線程等待
謝謝,我不認爲*有任何死鎖,但這可能是原因.. – MalcomTucker 2010-03-14 15:34:20