您的位置:首页 > 编程语言 > Java开发

Java多线程核心技术(五):定时器Timer

2017-02-28 15:54 459 查看
Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务。

1、schedule(TimerTask task,Date time)

方法schedule(TimerTask task,Date time)的作用是在指定的日期执行一次某一任务。

如下代码是执行时间晚于当前时间的示例:

public class TestClass{
private static Timer timer = new Timer();
static public class MyTask extends TimerTask{
@Override
public void run(){
System.out.println("运行了!时间为:"+new Date());
}
}
public static void main(String[] args) throws InterruptedException{
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2017-02-28 15:13:00";
Date dateRef;
dateRef = sdf.parse(dateString);
System.out.println("计划运行时间: " + dateRef.toLocaleString()+"\n当前时间:"+new Date().toLocaleString());
timer.schedule(task, dateRef);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
运行结果如下:



当计划执行任务的时间早于当前时间时,则立即执行task任务。

TimerTask是以队列的方式一个一个被顺序执行的,所以执行的时间有可能和预期的时间不一致,因为前面的任务有可能消耗的时间较久,则后面的任务运行的时间也会被延迟。

2、schedule(TimerTask task,Date firstTime,long period)

方法schedule(TimerTask task,Date firstTime,long period)的作用是在指定的日期之后,按指定的间隔周期性地无限循环地执行某一任务。

TimerTask类中的cancel()方法的作用是将自身从任务队列中清除。

Timer类中的cancel()方法的作用是将任务队列中的全部任务清空。

3、schedule(TimerTask task,long delay)

方法schedule(TimerTask task,long delay)的作用是以执行schedule(TimerTask task,long delay)方法当前的时间为参考时间,在此时间基础上延迟指定的毫秒数后执行一次TimerTask任务。

4、schedule(TimerTask task,long delay,long period)

方法schedule(TimerTask task,long delay,long period)的作用是以执行此方法的当前时间为参考时间,在此时间基础上延迟指定的毫秒数,再以某一间隔时间无限次数地执行某一任务。

5、scheduleAtFixedRate(TimerTask task,Date firstTime,long period)

使用schedule方法:如果执行任务的时间没有被延时,那么下一次任务的执行时间参考的是上一次任务的“开始”时的时间来计算。

使用scheduleAtFixedRate方法:如果执行任务的时间没有被延时,那么下一次任务的执行时间参考的是上一次任务的“结束”时时间来计算。

延时情况时,两者下一次任务执行的时间参考都是上一次任务结束时的时间。

注:如果计划任务的运行时间早于当前时间,则schedule不会执行时间差内的任务,而 scheduleAtFixedRate会执行时间差内的任务,如下代码可测试这一点:

public class TestClass{
private static Timer timer = new Timer();
static public class MyTask extends TimerTask{
@Override
public void run(){
System.out.println("运行了!时间为:"+new Date());
}
}
public static void main(String[] args) throws InterruptedException{
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2017-02-28 15:50:00";
Date dateRef;
dateRef = sdf.parse(dateString);
System.out.println("计划运行时间: " + dateRef.toLocaleString()+"\n当前时间:"+new Date().toLocaleString());
timer.schedule(task, dateRef, 10000);
//			timer.scheduleAtFixedRate(task, dateRef, 10000);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
运行结果如下:



把schedule换成scheduleAtFixedRate,结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息