我使用Timer和TimerTasks
启动两个线程Timer timer = new Timer();
TimerTask task = new TimerTask() {
public void run() {
doSomething();
}
};
Calendar start = Calendar.getInstance();
timer.scheduleAtFixedRate(task, start.getTime(),
1000 * 60 * 60);
现在有时第二个线程会停止。是否有可能观察线程可能在此线程停止时发送邮件,可能是由寻找第二个线程的第三个线程?
答案 0 :(得分:2)
您需要保持对Timer
生存的引用 - 如果Timer
被垃圾收集,则该线程将停止。来自the docs:
在最后一次实时参考之后 定时器对象消失了 已完成的任务已完成 执行,计时器的任务执行 线程优雅地终止(和 变得垃圾 采集)。但是,这可以采取 任意长时间发生。默认情况下, 任务执行线程不运行 作为守护程序线程,所以它是有能力的 保持申请 终止。如果来电者想要 终止计时器的任务执行 线程很快,调用者应该 调用计时器的取消方法。
可能不是问题,但这是最可能的原因。我假设如果你能保持线程活着,你不需要检查它吗?
答案 1 :(得分:0)
我建议在您的计划中添加Thread#setDefaultUncaughtExceptionHandler。你可以拥有这个日志/电子邮件/等等。虽然有一个 catch(Throwable)是更好的设计,但是有一个未被捕获的异常处理程序可以处理你错过的任何情况。