## Timer
Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。
## TimerTask
一个Timer可以调度任意多个TimerTask,它会将TimerTask存储在一个队列中,顺序调度,如果想两个TimerTask并发执行,则需要创建两个Timer。
下面是一个简单的demo:
- 新建一个TimerTask实例
package lxd.timer.demo;
import java.util.TimerTask;
/**
*
* 任务调度timer demo.
*
* <pre>
* 任务调度timer demo.
* </pre>
*
* @author 李晓东
*
* 2017.05.21
*
* @since 1.0
*
*/
public class MyTimerTask extends TimerTask {
private String name;
public MyTimerTask(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println("current timeTask name: " + name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.调用MyTimerTask
package lxd.timer.demo;
import java.util.Timer;
/**
*
* TimeTask调用demo
*
* <pre>
* TimeTask调用demo
* </pre>
*
* @author 李晓东
*
* 2017.05.21
*
* @since 1.0
*
*/
public class MyTimer {
public static void main(String[] args) {
//1.创建Timer实例
Timer timer = new Timer();
//2.创建TimerTask
MyTimerTask timerTask = new MyTimerTask("001Task");
//3.设定两秒后执行任务,以后每隔一秒执行一次
timer.schedule(timerTask, 2000L, 1000L);
}
}
Timer的定时调度函数
schedule的四种用法
- schedule(task,time)
参数
task -所要安排的任务
time -执行任务的时间
作用:在时间等于或超过time的时候执行且仅执行一次task
- schedule(task,time, period)
参数
task -所要安排的任务
time -执行任务的时间
period -执行一次task的时间间隔,单位毫秒
作用:时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task
- schedule(task, delay)
参数
task -所要安排的任务
delay -执行任务前的延迟时间,单位是毫秒
作用:等待delay毫秒后执行且仅执行一次task
- schedule(task, delay, period)
参数
task -所要安排的任务
delay -执行任务前的延迟时间,单位是毫秒
period -执行一次task的时间间隔,单位是毫秒
作用:等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task
scheduleAtFixedRate的两种用法
- scheduleAtFixedRate(task, time, period)
参数
task -所要安排的任务
time -执行任务的时间
period -执行一次task的时间间隔,单位毫秒
作用:时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task
- scheduleAtFixedRate(task, delay, period)
参数
task -所要安排的任务
delay -执行任务前的延迟时间,单位是毫秒
period -执行一次task的时间间隔,单位是毫秒
作用:等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task
下面定时调度函数的demo,timeTask依旧使用上方自定义的MyTimeTask
package lxd.timer.demo;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
/**
*
* TimeTask调用demo
*
* <pre>
* TimeTask调用demo
* </pre>
*
* @author 李晓东
*
* 2017.05.21
*
* @since 1.0
*
*/
public class MyTimer {
public static void main(String[] args) {
//1.创建Timer实例
Timer timer = new Timer();
//2.创建TimerTask
MyTimerTask timerTask = new MyTimerTask("001Task");
/*
* 获取当前时间,并设置成距离当前时间三秒之后的时间
*
*/
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("timer 类中 当前时间:" + sf.format(calendar.getTime()));
calendar.add(Calendar.SECOND, 3);
/*
* schedule的第一种用法
* schedule(task,time)
* 在时间等于或超过time的时候执行且仅执行一次task
*/
// timerTask.setName("schedule1");
// timer.schedule(timerTask, calendar.getTime());
/*
* schedule的第二种用法
* schedule(task,time, period)
* 时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task
*/
// timerTask.setName("schedule2");
// timer.schedule(timerTask, calendar.getTime(), 2000);
/*
* schedule的第三种用法
* schedule(task, delay)
* 等待delay毫秒后执行且仅执行一次task
*/
// timerTask.setName("schedule3");
// timer.schedule(timerTask, 3000);
/*
* schedule的第四种用法
* schedule(task, delay, period)
* 等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task
*/
// timerTask.setName("schedule4");
// timer.schedule(timerTask, 3000, 2000);
/*
* scheduleAtFixedRate的第一种用法
* scheduleAtFixedRate(task, time, period)
* 时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task
*/
// timerTask.setName("scheduleAtFixedRate1");
// timer.scheduleAtFixedRate(timerTask, calendar.getTime(), 3000);
/*
* scheduleAtFixedRate的第二种用法
* scheduleAtFixedRate(task, delay, period)
* 等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task
*/
timerTask.setName("scheduleAtFixedRate2");
timer.scheduleAtFixedRate(timerTask, 2000, 3000);
}
}