【问题标题】:Java unlimited thread stops after some timeJava无限线程在一段时间后停止
【发布时间】:2010-08-29 20:48:50
【问题描述】:

我有一个网络服务器和一些数据存储类型的服务器。我需要的是两台服务器之间的同步。 Web 服务器始终处于运行状态,我尽量让数据服务器保持运行状态。

两者都有 MySQL 数据库,我已经编写了脚本来同步它们。我制作了一个 java 程序,它每 10 秒从 Web 服务器获取新的数据字段并将它们存储在自己的数据库中。一个无限制的 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 服务器。

真正的问题:

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

可能性#1:互联网断开连接:我尝试拔下网线,但它开始出现异常,但当我重新连接网线后,它开始正常工作。

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

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

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

【问题讨论】:

  • 假设你的意思是 doCheck() 的 run() 方法执行操作,而不是它的构造函数?

标签: java multithreading timer


【解决方案1】:

我无法提供具体原因,但计时器只有一个内部线程,如果该线程死亡,则不会自动重新启动。因此,如果 TimerTask 的 run() 方法仅抛出一次异常,那么 Timer 将永远死亡。

你可能错过了这个异常,所以我会做以下事情

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

如果您的 TimerTask 抛出异常,您应该会看到两次,一次是在 TimerTask 的 try/catch 中,一次是在 Timer 线程终止时由默认的异常处理程序。这将确认 Timer 线程正在被异常杀死。

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

可能值得改用 1.5 中引入的 ScheduledExecutorService,因为它更有用,并且如果计划任务抛出异常可能会更健壮(我不是 100% 对此,请检查相关 API实施文档)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2011-09-25
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多