[英]Java unlimited thread stops after some time
我有一個Web服務器和一些數據存儲類型的服務器。 我需要的是兩台服務器之間的同步。 Web服務器總是處於運行狀態,我盡可能地保持數據服務器的運行。
兩者都有MySQL數據庫,我已經編寫了腳本來同步它們。 我創建了一個java程序,它從Web服務器獲取新數據字段,並每隔10秒將它們存儲在自己的數據庫中。 無限制的java線程就是這樣做的。 這將是執行此操作的代碼段:
Timer timer;
Date current_date = new Date() ;
timer = new Timer();
timer.scheduleAtFixedRate(new doCheck(), current_date, 10 * 1000);
doCheck()類的構造函數以XML格式從Web服務器獲取數據。 沒有mysql直接連接b / w服務器。
但是當這個腳本全天候運行時,在幾天之后的一段時間內,腳本(基本上是從Web服務器獲取XML的線程)突然停止運行並且同步完全斷開連接。
可能性#1:互聯網斷開:我嘗試拔掉網絡電纜,並開始提供例外,但一旦我重新連接電線,它就開始工作得非常好。
可能性#2:代碼中的任何異常等:我正在維護日志,但大多數情況下它會突然停止而沒有異常或錯誤。
可能性#3:手動取消線程:沒有人接觸服務器:P並且只有一個按鈕可以取消它,所以這是不可能的。
為什么會這樣? 我只想讓這個腳本無限次運行。
我不能提供一個具體的原因,這將發生,但Timer只有一個內部線程,如果這個線程死了,那么它不會自動重啟。 因此,如果您從TimerTask的run()方法拋出一個異常,那么Timer將永遠消失。
您可能會遺漏此異常,因此我會執行以下操作
如果從TimerTask中拋出異常,您應該看到它兩次,一次在TimerTask try / catch中,一次在Timer線程死亡時由默認異常處理程序查看。 這將確認Timer線程被異常殺死。
假設是這種情況,那么你將不得不查看異常並決定如何處理它。 您可以捕獲該特定異常類型並記錄/吞下它(修改您的TimerTask實現以適應),或者讓異常傳播並在系統中引發警報。
可能值得切換到使用1.5中引入的ScheduledExecutorService ,因為它更有用,如果計划任務拋出異常,可能會更健壯(我不是100%,請查看實現的相關API文檔) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.