定时任务就是基于给定的时间点,时间间隔或者给定的执行次数自动的执行任务。
Timer API定义:
有且仅有一个后台线程,对多个任务线程进行定时定频率的调用。
主要涉及两个类:java.util.Timer和java.util.TimerTask类、
简单的实例:在当前时间的2秒钟后开始执行,然后每隔4秒钟执行一次打印任务
MyTimerTask.java
import java.util.TimerTask;
/**
* <p>类说明:</p>
* @author 作者:孙硕
* @version 时间:2017年8月13日 下午7:43:44
*/
public class MyTimerTask extends TimerTask {
private String name;
public MyTimerTask(String name) {
this.name = name;
}
@Override
public void run() {
//打印当前名字的内容
System.out.println("Current exec name is : " + name);
}
//setter和getter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
MyTimer.java
import java.util.Timer;
/**
* <p>类说明:</p>
* @author 作者:孙硕
* @version 时间:2017年8月13日 下午7:49:44
*/
public class MyTimer {
public static void main(String[] args) {
//1.创建TImer实例
Timer timer = new Timer();
//2.创建TimerTask实例
MyTimerTask myTimerTask = new MyTimerTask("No.1");
//3.通过timer定频率的调用timertask业务逻辑
//在当前时间的2秒钟后开始执行,然后每隔4秒钟执行一次
timer.schedule(myTimerTask, 2000L, 4000L);
}
}
最后执行的结果按要求执行。
schedule的4种用法:
1. public void schedule(TimerTask task, Date time)
task:待执行的任务 time:执行的时间
当时间等于或者大于time的时候执行且只执行一次task
2.public void schedule(TimerTask task, Date firstTime, long period)
task:待执行的任务 time:执行的时间
当时间等于或者大于time的时候首先执行一次task,然后每隔period毫秒再执行一次task。
3. public void schedule(TimerTask task, long delay)
在当前时间延迟delay毫秒后执行且只执行一次任务
4. public void schedule(TimerTask task, long delay, long period)
当前时间延迟delay毫秒后执行一次任务,然后每隔period毫秒再执行一次task
附上代码:
MyTimerTask2.java
package com.sunshuo.timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimerTask;
/**
* <p>类说明:schedule(TimerTask task, Date time)</p>
* @author 作者:孙硕
* @version 时间:2017年8月13日 下午7:43:44
*/
public class MyTimerTask2 extends TimerTask {
private String name;
public MyTimerTask2(String name) {
this.name = name;
}
@Override
public void run() {
//以yyyy-MM-dd HH:mm:ss格式打印时间
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(
"Current exec time is : " + sdf.format(calendar.getTime()));
//打印当前名字的内容
System.out.println("Current exec name is : " + name);
}
//setter和getter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
MyTimer2.java
package com.sunshuo.timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
/**
* <p>类说明:</p>
* @author 作者:孙硕
* @version 时间:2017年8月13日 下午7:49:44
*/
public class MyTimer2 {
public static void main(String[] args) {
//1.创建TImer实例
Timer timer = new Timer();
//2.创建TimerTask实例
MyTimerTask2 myTimerTask = new MyTimerTask2("No.2");
/*
* 获取当前时间,并设置3秒钟后的时间
*/
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("MyTimer2 : Current exec time is : "
+ sdf.format(calendar.getTime()));
calendar.add(Calendar.SECOND, 3);//设置当前时间加3秒钟
//-------- schedule的用法 ----------
/*
* 1. public void schedule(TimerTask task, Date time)
* 在时间等于或者大于time的时间执行且只执行一次
*/
myTimerTask.setName("schedule(task, time)的用法");
timer.schedule(myTimerTask, calendar.getTime());
/*
* 2. public void schedule(TimerTask task, Date firstTime, long period)
* 在时间等于或者大于time的时间首先执行一次,然后每隔period毫秒再执行一次task
*/
myTimerTask.setName(
"schedule(TimerTask task, Date firstTime, long period)的用法");
timer.schedule(myTimerTask, calendar.getTime(), 4000L);
/*
* 3. public void schedule(TimerTask task, long delay)
* 在当前时间延迟delay毫秒后执行且只执行一次任务
*/
myTimerTask
.setName("public void schedule(TimerTask task, long delay)的用法");
timer.schedule(myTimerTask, 1000L);
/*
* 4. public void schedule(TimerTask task, long delay, long period)
* 当前时间延迟delay毫秒后执行一次任务,然后每隔period毫秒再执行一次task
*/
myTimerTask.setName(
"public void schedule(TimerTask task, long delay, long period)的用法");
timer.schedule(myTimerTask, 1000L, 3000L);
}
}
scheduledExecutionTime和schedule区别:
1. 首次计划执行的时间遭遇当前的时间
2.任务执行所需的时间超出执行周期间隔
(1)schedule方法:“fixed-delay”;如果第一次执行时间被delay了,随后的执行时间按 照 上一次 实际执行完成的时间点 进行计算
(2)scheduleAtFixedRate方法:“fixed-rate”;如果第一次执行时间被delay了,随后的执行时间按照 上一次开始的 时间点 进行计算,并且为了”catch up”会多次执行任务,TimerTask中的执行体需要考虑同步
(1)schedule方法:下一次执行时间相对于 上一次 实际执行完成的时间点 ,因此执行时间会不断延后
(2)scheduleAtFixedRate方法:下一次执行时间相对于上一次开始的 时间点 ,因此执行时间不会延后,存在并发性
TimerTask里其他函数:
cancel():取消当前TImerTask里的任务
public long scheduledExecutionTime()
返回最近实际执行此任务的时间
Timer其他函数:
cancel():终止此计时器,丢弃当前已经安排的所有任务
purge:将已经取消的任务从队列中移除,返回移除的数量