private static Timer timer = new Timer();
private static Timer timer = new Timer(true);//是守护线程,默认为false
timer.schedule(TimerTask task,Date date);//如果date早于此时,直接执行;task是依次执行的
timer.schedule(TimerTask task,Date date,Long long);//long就是循环时间
task.cancel();//task任务结束
timer.cancel();//所有任务结束,但是不是实时的,可能抢不到线程
timer.schedule(TimerTask task,Long long1);//等待long1毫秒后执行,执行一次
timer.schedule(TimerTask task,Long long1,long2);//等待long1后执行,且每long2执行一次
timer.scheduleAtFixedRate(TimerTask task,Date date,Long long);
与timer.schedule的区别,scheduleAtFixedRate第i次的执行开始时间是date+(i-1)*long时间点,就是不会因为上一个程序的延时而延时,只是会等待;而schedule不是,它的执行时间是上一次的开始时间+long;
简单而言,就是scheduleAtFixedRate具有追赶性
代码
package mon03.timer;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Class0308 {
private static Timer timer = new Timer(true);
static public class MyTask extends TimerTask {
@Override
public void run() {
int i = 0;
System.out.println("开始"+i+","+System.currentTimeMillis());
try {
Thread.sleep(2000);//每次执行时间为2s
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("结束"+(i++)+","+System.currentTimeMillis());
}
}
public static void main(String[] args) {
MyTask task = new MyTask();
Date date = new Date(System.currentTimeMillis() - 3000);//启动时间为3s前,每次中间为4s
// timer.scheduleAtFixedRate(task, date, 4000);//此执行效果为1
// timer.schedule(task, date, 4000);//此执行效果为2
try {
Thread.sleep(50000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(System.currentTimeMillis());
timer.cancel();
}
}
schedule的执行效果
开始0,1552010641902
结束0,1552010643903
开始0,1552010645903//没有追赶,时间是上一次时间+4s
结束0,1552010647903
开始0,1552010649903
结束0,1552010651903
scheduleAtFixedRate的执行效果
开始0,1552010718951
结束0,1552010720951
开始0,1552010720951//追了,因为应该的时间比此时早,直接执行
结束0,1552010722951
开始0,1552010723950//等了1s后,追上了
结束0,1552010725950
开始0,1552010727950