2011-04-06 58 views
2

我的程序相當大,並且因爲它傾向於隨機執行進程,有時它會卡住並永遠循環。如果我手動強制停止並重新啓動程序,通常(約85%)時間,程序將完成所有命令並終止。如何重新啓動卡住的Java程序?

有沒有辦法使Java程序在20秒後自動重啓,如果卡住了?我試着用系統時間來解決問題,但問題是如果我的程序停留在for循環中,它不會更新系統時間,直到下一次迭代。

+16

當程序包含如此嚴重的問題時重新啓動程序不會解決問題。找到根本原因。 – 2011-04-06 22:19:15

+2

你最好的選擇是找到它的原因。我建議添加一些調試消息,當它停滯時,查看最後一條調試消息,這應該讓你知道它失敗的位置。添加系統狀態參數可能會查明確切問題 – corsiKa 2011-04-06 22:21:42

+2

(A +1,因爲我認爲當前的答案和評論非常相關,應該有更多的讀者。) – 2011-04-06 22:25:40

回答

1

考慮到解決這個問題就意味着解決了停機問題,我們可以相當肯定的是,整個方法註定;)

你可以明顯地使用定時器一些指定的時間和諸如此類的東西后殺程序,但真的 - 在程序中找到錯誤。

7

這不是解決這個問題的正確方法!你需要弄清楚爲什麼你的程序陷入了無限循環,然後修復它。 「好吧,讓我們再試一次」不是解決錯誤的正確方法 - 你不知道這個錯誤會產生什麼其他影響。你可能會得到不正確的輸出。調試程序,不要解決這個缺陷。

您可以使用一些啓動java程序的外部程序,並在20秒後將其終止,然後再次啓動它,但這又不是解決問題的正確方法。

1

你的程序不應該卡住並永遠循環,修復它。但如果這是不可能的,你仍然希望永久循環後的「重新啓動」程序,我建議你這樣的解決方案:

創建將成爲導演的主程序。導演將創建線程。線程將執行可能需要很多時間的主要算法。導演將會等待一段時間,這將是最後的參數。此參數有助於導演識別線程是否處於永久循環狀態(這需要很長時間)。當永久循環將被識別時,它將終止線程並開始新線程(重新啓動)。

1

查看ExecutorServices獲取一種機制,該機制允許您調用一段代碼並在預期時間內未完成時收到超時。然後,您可以按照您的看法採取行動。

另一個不錯的工具是在循環時使用JDK中的jvisualvm附加到程序。然後你可以請求一個線程轉儲並用它來弄清楚它在做什麼。