package com.jd.schdule;
import java.util.Timer;
import java.util.TimerTask;
/**
* Timer执行延时任务
* 缺点:
* 1、当一个Timer指定多个TimerTask时,一个TimerTask的延时可能会影响后续TimerTask的运行
* 2、当TimerTask抛出未检查异常,Timer线程将被关闭,同时也可能影响调用线程。
* 3、基于服务器绝对时间(基于绝对时间为什么是缺点??)
* Timer代替类,参见 http://medicine.iteye.com/blog/1564950
* @author yfzhangbin
*/
public class TimerTest {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("开始第一个任务");
try {
Thread.sleep(5000);
} catch(Exception e) {
e.printStackTrace();
}
if (true) {
//throw new RuntimeException("error"); // 解除注释 程序运行到此处将结束Timer线程,并抛出异常
}
System.out.println("结束第一个任务");
}
}, 1000);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("开始第二个任务");
try {
Thread.sleep(5000);
} catch(Exception e) {
e.printStackTrace();
}
System.out.println("结束第二个任务");
}
}, 1000);
System.out.println("主线程结束!"); // 因为Timer线程非后台线程,所以主线程执行完毕后jvm不会结束。
}
}
输出:
主线程结束!
开始第一个任务
结束第一个任务
开始第二个任务
结束第二个任务
解除throw注释:
主线程结束!
开始第一个任务
Exception in thread "Timer-0" java.lang.RuntimeException: error
at com.jd.schdule.TimerTest$1.run(TimerTest.java:30)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)