最近有个问题,在没有timer调用cancel()方法的情况下,报以下异常
Exception in thread "main" java.lang.IllegalStateException: Timer already cancelled.
at java.util.Timer.sched(Timer.java:397)
at java.util.Timer.schedule(Timer.java:193)
at TimerTest.main(TimerTest.java:23)
说一个可以排查的点,就是timer在执行任务的过程中如果抛出了RuntimeException,并且接着又去执行另一个新任务时,会认定定时器已经取消,产生这个异常,所以可以在定时任务之间排查是否有异常抛出。
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
private Timer timer = new Timer();
private void lanuch() {
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("task start");
throw new RuntimeException();
}
};
timer.schedule(task, 0, 1000);
}
private void addNewTask() {
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("exception");
}
}, 100);
}
public static void main(String[] args) throws Exception {
TimerTest test = new TimerTest();
test.lanuch();
Thread.sleep(1000);
test.addNewTask();
}
}
输出:
task start
Exception in thread "Timer-0" java.lang.RuntimeException
at TimerTest$1.run(TimerTest.java:11)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Exception in thread "main" java.lang.IllegalStateException: Timer already cancelled.
at java.util.Timer.sched(Timer.java:397)
at java.util.Timer.schedule(Timer.java:193)
at TimerTest.addNewTask(TimerTest.java:19)
at TimerTest.main(TimerTest.java:31)