Java无限制的线程在一段时间后停止

DJ'*_*DJ' 3 java multithreading timer

我有一个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);
Run Code Online (Sandbox Code Playgroud)

类doCheck的()构造函数从XML格式的Web服务器获取数据.没有mysql直接连接b/w服务器.

真正的问题:

但是当这个脚本全天候运行时,在几天之后的一段时间内,脚本(基本上是从Web服务器获取XML的线程)突然停止运行并且同步完全断开连接.

可能性#1:互联网断开:我尝试拔掉网络电缆,并开始提供例外,但一旦我重新连接电线,它就开始工作得很好.

可能性#2:代码中的任何异常等:我正在维护日志,但大多数情况下它会突然停止而没有异常或错误.

可能性#3:手动取消线程:没有人接触服务器:P并且只有一个按钮可以取消它,所以这是不可能的.

为什么会这样?我只想让这个脚本无限次运行.

Mik*_*e Q 8

我不能提供一个具体的原因,这将发生,但Timer只有一个内部线程,如果这个线程死亡,那么它不会自动重新启动.因此,如果您从TimerTask的run()方法抛出一个异常,那么Timer将永远消失.

您可能会遗漏此异常,因此我会执行以下操作

  • 实现默认线程异常处理程序,并确保将结果记录在可以找到它的位置
  • (可选)在TimerTask实现中实现try/catch/rethrow块.不要在这里吞下异常,只需记录并重新抛出它(现在,见下文).

如果从TimerTask中抛出异常,您应该看到它两次,一次在TimerTask try/catch中,一次在Timer线程死亡时由默认异常处理程序查看.这将确认Timer线程被异常杀死.

假设是这种情况,那么你将不得不查看异常并决定如何处理它.您可以捕获该特定异常类型并记录/吞下它(修改您的TimerTask实现以适应),或者让异常传播并在系统中引发警报.

可能值得切换到使用1.5中引入的ScheduledExecutorService,因为它更有用,如果计划任务抛出异常,可能会更健壮(我不是100%,请查看实现的相关API文档) .