丢失线程时的异常

时间:2009-11-19 09:13:07

标签: java exception multithreading

我使用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);

现在有时第二个线程会停止。是否有可能观察线程可能在此线程停止时发送邮件,可能是由寻找第二个线程的第三个线程?

2 个答案:

答案 0 :(得分:2)

您需要保持对Timer生存的引用 - 如果Timer被垃圾收集,则该线程将停止。来自the docs

  

在最后一次实时参考之后   定时器对象消失了   已完成的任务已完成   执行,计时器的任务执行   线程优雅地终止(和   变得垃圾   采集)。但是,这可以采取   任意长时间发生。默认情况下,   任务执行线程不运行   作为守护程序线程,所以它是有能力的   保持申请   终止。如果来电者想要   终止计时器的任务执行   线程很快,调用者应该   调用计时器的取消方法。

可能不是问题,但这是最可能的原因。我假设如果你能保持线程活着,你不需要检查它吗?

答案 1 :(得分:0)

我建议在您的计划中添加Thread#setDefaultUncaughtExceptionHandler。你可以拥有这个日志/电子邮件/等等。虽然有一个 catch(Throwable)是更好的设计,但是有一个未被捕获的异常处理程序可以处理你错过的任何情况。

相关问题