簡體   English   中英

Java無限制的線程在一段時間后停止

[英]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實現中實現try / catch / rethrow塊。 不要在這里吞下異常,只需記錄並重新拋出它(現在,見下文)。

如果從TimerTask中拋出異常,您應該看到它兩次,一次在TimerTask try / catch中,一次在Timer線程死亡時由默認異常處理程序查看。 這將確認Timer線程被異常殺死。

假設是這種情況,那么你將不得不查看異常並決定如何處理它。 您可以捕獲該特定異常類型並記錄/吞下它(修改您的TimerTask實現以適應),或者讓異常傳播並在系統中引發警報。

可能值得切換到使用1.5中引入的ScheduledExecutorService ,因為它更有用,如果計划任務拋出異常,可能會更健壯(我不是100%,請查看實現的相關API文檔) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM