在我參與的開源應用程序中,我們遇到了一個錯誤,應用程序並不總是正常關閉。這就是我想要解決的問題。分析多線程Java應用程序
經驗表明,大多數情況下,線程和進程在啓動時會發生這種情況,但是沒有正確管理(例如線程正在等待套接字連接,應用程序正在關閉並且線程持續等待) 。
考慮到這一點,我已經在整個數據源中搜索了'.start()',並發現了53個事件(這嚇了我一下)。
作爲第一步,我想創建一個幫助器類(ThreadExecutor),其中當前代碼'thread.start()'將被'ThreadExecutor.Execute(thread)'替換爲:a)只有少量更改現有的源代碼和b)一個單獨的類,我可以很容易地檢查哪些線程不應該像他們應該那樣結束。要做到這一點,我想
- 添加線程調用Execute方法
- 時啓動線程
- 當它結束時從activeThreads列表中刪除它執行到列表稱爲activeThreads。
這樣我就可以獲得所有執行線程的最新列表,並且當應用程序掛起時,我可以在那裏看到哪個線程正在導致它。
問題:
- 你認爲怎麼樣的概念?我通常編碼c#,並知道如何使用.NET與工作人員一起做它,但我不太清楚Java中最好的(我想在現有源代碼中儘可能少地修改代碼)。
- 如果這個概念似乎沒問題,我怎麼能得到一個線程終止的通知。我想避免每隔一段時間檢查一次,以瞭解activeThreads中包含的所有線程的狀態,以便在終止時刪除它們。
只是爲了澄清:之前搞清楚如何正確地終止應用程序,我要問這裏有什麼發現哪些線程是在導致某些測試用例這是非常難以複製的最佳/最簡單的方法。
如果您創建線程守護進程 - 當應用程序被終止時它們不會被終止嗎? –
http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#setDaemon%28boolean%29 –
當應用程序未正確關閉時,是否嘗試過線程轉儲?看到什麼線程卡住了,他們在做什麼?這可能會給你一些線索。更多信息:http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/ –