今天研究了一下Java的定时器,下面简单说一下并给出案例
## 简介 ##
定时器顾名思义就是起到定时作用,定时执行任务,启动一个定时器,其底层就会启动一个线程,你也可以理解,定时器是就是定时启动一个线程去执行你所要执行的任务!!
要了解定时器,做要了解jdk带的“Timer”和“TimerTask”,
- Timer:我理解是定时器的工具,起到定时作用,和你所要执行的内容无关。
TimerTask是一个接口共实现,这个接口底层又实现了线程接口Runnable,所有必须重写 run方法, 这也印证了上面我说的定时器是启动线程执行任务!
Timer主要有几个构造方法:
1.time.schedule(TimerTask task, Date time);参数 task是TimerTask对象,就是你所要执行的任务, time 是Date对象,是启动时间!
2.time.schedule(TimerTask task, Date time,Long long); 是TimerTask对象,就是你所要执行的任务, time 是Date对象,是启动时间! long 是Long对象,是循环间隔时间!
3.boolean cancel():用于取消计时器任务。
4.scheduleAtFixedRate(TimerTask task, Date time, long long):是TimerTask对象,就是你所要执行的任务, time 是Date对象,是启动时间! long 是Long对象,是循环间隔时间!
注意:
time.schedule(TimerTask task, Date time,Long long)和scheduleAtFixedRate(TimerTask task, Date time, long long) 这两个构造方法看是一样,但是内部不一样:
schedule(TimerTask task, Date time,Long long):如果执行任务的时间没有被延时,那么下一次执行时间参考上一次任务的“开始”时间来计算
scheduleAtFixedRate(TimerTask task, Date time, long long):如果执行任务的时间没有被延时,那么下一次执行时间参考上一次任务的“结束”时间来计算
简单定时任务案例:
package Thread;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Test3 {
private static Timer time=new Timer();//初始化定时器工具
public static void main(String[] args) {
try {
MyTask1 mt=new MyTask1();//初始化定时任务
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strTime="2017-09-01 15:22:00";
Date date=sdf.parse(strTime);//设置定时器起始时间
time.schedule(mt, date);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 定时任务
* @author user
*
*/
class MyTask1 extends TimerTask{
/**
* 所要定时的内容写在run里面
*/
@Override
public void run(){
try {
System.out.println("运行了MyTASK 开始运行时间:"+new Date().toLocaleString());
Thread.sleep(3000);//暂停3秒
System.out.println("运行了MyTASK 结束运行时间:"+new Date().toLocaleString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
控制台打印结果:
可以看出来运行时间和设定时间一致!
循环案例
package Thread;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Test1 {
private static Timer time=new Timer();
public static void main(String[] args) {
try {
MyTask mt= new MyTask();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strTime="2017-09-01 16:19:00";
Date date=sdf.parse(strTime);
time.schedule(mt,date,2000);//循环
} catch (Exception e) {
e.printStackTrace();
}
}
static class MyTask extends TimerTask{
@Override
public void run(){
try {
System.out.println("运行了MyTASK 开始运行时间:"+new Date().toLocaleString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
可以看出来每隔两秒执行一次