GeXiangDong

精通Java、SQL、Spring的拼写,擅长Linux、Windows的开关机

0%

java.util.Timer无故被cancel掉的可能原因

遇到一个Timer某些情况下会自动被cancel掉,再次schedule TimerTask时会抛出java.lang.IllegalStateException: Timer already cancelled. 程序中并无timer.cancel()的调用。最后发现是TimerTask执行时发生未被捕获的异常导致,例如下段代码肯定会出问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.*;

public class TestTimer{

public static void main(String[] argvs) throws Exception{
Timer timer = new Timer(true);
timer.schedule(new MyTimerTask(), 1); //1毫秒后执行 MyTimerTask

Thread.sleep(1000);
timer.schedule(new MyTimerTask(), 1); //这里会抛出 java.lang.IllegalStateException: Timer already cancelled.;因为执行上一个TimerTask时异常导致Timer结束了
}
}

class MyTimerTask extends TimerTask {

public void run() {
//下面这句会导致运行此TimerTask的Timer被cancel掉
throw new RuntimeException();
}
}