0

我怀疑异常可能会使 TimerTask 停止运行,在这种情况下,我很可能需要第二个 timetask 来监视第一个仍在运行?

更新

感谢您的回答。我继承了这个代码,所以有点无知......

我刚刚看到,如果我在工作中抛出未捕获的异常,TimerThread 将永远停止运行。

的运行方法TimerThread表明,如果抛出异常,我的预定线程将不再运行。

public void run() {
    try {
        mainLoop();
    } finally {
        // Someone killed this Thread, behave as if Timer cancelled
        synchronized(queue) {
            newTasksMayBeScheduled = false;
            queue.clear();  // Eliminate obsolete references
        }
    }
}

堆栈跟踪的结尾将是:

at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)

所以临时解决方案是抓住一切……长期解决方案是像 BalusC 所说的那样进行更好的调度。

4

1 回答 1

2

TimerTasks 在抛出未捕获的异常时死亡(它是否在 tomcat 中运行是无关的)。解决这个问题的最简单方法是在你的 run 方法中捕获 RuntimeException,如果你想要的话,记录并继续。

还建议在重新抛出之前捕获 Throwables 并记录它,以便您可以在日志中看到堆栈跟踪,如下所示:

    try{
        doRun();
    }catch (RuntimeException e){
        logger.error("Uncaught Runtime Exception",e);
        return; // Keep working
    }catch (Throwable e){
        logger.error("Unrecoverable error",e);
        throw e;
    }
于 2013-09-23T17:30:39.797 回答