[英]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.