繁体   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