jdk中的定时器主要涉及两个类 Timer 和TimeTask
注意点
timer 线程安全
一个timer只能执行一个线程
TimeTask是抽象类
timer通过调度schedule()方法从而调度timeTask 实现任务调度
schedule VS. scheduleAtFixedRate
这两个方法都是任务调度方法,他们之间区别是,schedule会保证任务的间隔是按照定义的period参数严格执行的,如果某一次调度时间比较长,那么后面的时间会顺延,保证调度间隔都是period,而scheduleAtFixedRate是严格按照调度时间来的,如果某次调度时间太长了,那么会通过缩短间隔的方式保证下一次调度在预定时间执行。举个栗子:你每个3秒调度一次,那么正常就是0,3,6,9s这样的时间,如果第二次调度花了2s的时间,如果是schedule,就会变成0,3+2,8,11这样的时间,保证间隔,而scheduleAtFixedRate就会变成0,3+2,6,9,压缩间隔,保证调度时间。
案例
public class TimerTest {
public static void main(String[] args) {
Timer timer = new Timer();
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("开始执行 " + sdf.format(new Date()));
timer.schedule(new TimerTask(){
@Override
public void run() {
System.out.println("正在执行 " + sdf.format(new Date()));
timer.cancel(); //执行完成后结束timer
}
}, new Date(System.currentTimeMillis()+1000*10)); //延迟10秒执行
System.out.println("-----------------------------");
Timer timer2 = new Timer();
timer2.schedule(new TimerTask() { //立即执行 执行10次
volatile AtomicInteger count = new AtomicInteger(0);
@Override
public void run() {
System.out.println("timer2立即执行 " + sdf.format(new Date()));
if(count.getAndIncrement() > 10){
timer2.cancel();
};
}
}, 0, 1000);
}
}