Timer定时任务代码简洁,用的较为广泛,但除了传递TimerTask外,还有后面的一些参数在使用时,容易搞混淆,所以我特意从源码中找出来,整理一下。
1.当传递的参数只有一个long类型的delay时,就是延迟delay毫秒执行一次,但线程不会被销毁
public void schedule(TimerTask task, long delay) {
if (delay < 0)
throw new IllegalArgumentException("Negative delay.");
sched(task, System.currentTimeMillis()+delay, 0);
}
例如:
public static void main(String[] args) throws ParseException {
long delay = 1000;//1毫秒
TimerTask tt = new TimerTask() {
@Override
public void run() {
System.out.println("当前时间戳:"+System.currentTimeMillis());
}
};
Timer t = new Timer();
t.schedule(tt,delay);
}
会在延迟1000毫秒后输出当前时间戳一次,但程序不会结束运行 。
2.当传递的参数只有一个Date类型的time时,就是任务在time时刻开始执行一次
public void schedule(TimerTask task, Date time) {
sched(task, time.getTime(), 0);
}
例如:
public static void main(String[] args) throws ParseException {
Date time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2020-09-09 11:40:00");
TimerTask tt = new TimerTask() {
@Override
public void run() {
System.out.println("当前时间戳:"+System.currentTimeMillis());
}
};
Timer t = new Timer();
t.schedule(tt,time);
}
会在2020-09-09 11:40:00时刻输出当前时间戳一次,但程序不会结束运行 。
3.当传递的参数有一个long类型的delay和一个long类型的period时,就是延迟delay毫秒后, 每隔period毫秒执行一次
public void schedule(TimerTask task, long delay, long period) {
if (delay < 0)
throw new IllegalArgumentException("Negative delay.");
if (period <= 0)
throw new IllegalArgumentException("Non-positive period.");
sched(task, System.currentTimeMillis()+delay, -period);
}
例如:
扫描二维码关注公众号,回复:
12427964 查看本文章
public static void main(String[] args) throws ParseException {
long delay = 1000;//1毫秒
long period = 1000;//1毫秒
TimerTask tt = new TimerTask() {
@Override
public void run() {
System.out.println("当前时间戳:"+System.currentTimeMillis());
}
};
Timer t = new Timer();
t.schedule(tt,delay,period);
}
会在延迟1000毫秒后执行一次输出当前时间戳,然后每隔一秒执行一次输出当前时间戳。
4.当传递的参数有一个Date类型的firstTime和一个long类型的period时,就是在firstTime开始执行第一次,然后每隔 period毫秒执行一次
public void schedule(TimerTask task, Date firstTime, long period) {
if (period <= 0)
throw new IllegalArgumentException("Non-positive period.");
sched(task, firstTime.getTime(), -period);
}
例如:
public static void main(String[] args) throws ParseException {
Date time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2020-09-09 11:40:00");
System.out.println(time);
long period = 5000;//5毫秒
TimerTask tt = new TimerTask() {
@Override
public void run() {
System.out.println("当前时间戳:"+System.currentTimeMillis());
}
};
Timer t = new Timer();
t.schedule(tt,time,period);
}
会在2020-09-09 11:40:00时刻执行一次输出当前时间戳,然后每隔5秒执行一次
我整理一个表格方便记忆查询
四种参数 | 任务执行方式 | 任务执行次数 |
---|---|---|
schedule(TimerTask task, long delay) | 延迟delay毫秒执行 | 执行一次 |
schedule(TimerTask task, Date time) | 在time时刻开始执行 | 执行一次 |
schedule(TimerTask task, long delay, long period) | 延迟delay毫秒后执行一次,然后每隔period毫秒执行一次 | 无限执行 |
schedule(TimerTask task, Date firstTime, long period) | 在firstTime时刻开始执行一次,然后每隔 period毫秒执行一次 | 无限执行 |