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

时间:2010-08-29 20:48:50

标签: 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);

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

真正的问题:

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

可能性#1:互联网断开连接:我尝试拔掉网线,然后开始提供异常,但是一旦我重新连接电线,它就会开始正常工作。

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

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

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

1 个答案:

答案 0 :(得分:8)

我不能提供一个具体的理由来发生这种情况,但是Timer只有一个内部线程,如果这个Thread死了,那么它就不会自动重启。因此,如果您从TimerTask的run()方法抛出一个异常,那么Timer将永远消失。

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

  • 实施default thread exception handler并确保将结果记录在可以找到它的地方
  • 可选择在TimerTask实现中实现try / catch / rethrow块。不要在这里吞下异常,只需记录它并重新抛出它(现在,见下文)。

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

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

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

相关问题