直接上代码:
import java.util.Timer;
import java.util.TimerTask;
public class Main {
public static void main(String[] args) {
Timer timer = new Timer();
TimerTask task1 = new TimerTask() {
@Override
public void run() {
System.out.println("task1:"+System.currentTimeMillis());
int i=1/0;
}
};
TimerTask task2 = new TimerTask() {
@Override
public void run() {
System.out.println("task2:"+System.currentTimeMillis());
}
};
timer.schedule(task1,5000);
timer.schedule(task2,10000);
}
}
运行结果为:
现象:
给Timer对象里放入2个TimerTask任务,如果有某个任务抛出异常,会导致其他任务无法执行,整个Timer结束。
原因:
new Timer()的时候,会启动一个线程TimerThread
TimerThread的run方法执行,调用mainLoop方法:
mainLoop方法实际上是一个while(true)的循环,取出任务队列TaskQueue的第一个任务,在当前线程中执行该任务的run方法(如果这里抛出非InterruptedException异常,会导致TimerThread的run方法结束)。
如果当前没有任务,则阻塞等待,直到有新任务加入队列,唤醒该线程。
当某个任务执行完后,进行period值判断:
1.如果period大于0,表示该任务需要定时执行(每隔period毫秒需要执行一次),则调用rescheduleMin方法,对队列的任务进行顺序调整。
2.如果period等于0,表示该任务只需要执行一次,把该任务从队列里移除。