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

【Java多线程编程核心技术】5.定时器Timer-笔记总结

2017-11-22 22:54 726 查看
相关链接:

【Java多线程编程核心技术】1.Java多线程技能-笔记总结

【Java多线程编程核心技术】2.对象及变量的并发访问(上)-笔记总结

【Java多线程编程核心技术】2.对象及变量的并发访问(下)-笔记总结

【Java多线程编程核心技术】3.线程间通信 -笔记总结

【Java多线程编程核心技术】4.Lock的使用-笔记总结

【Java多线程编程核心技术】5.定时器Timer-笔记总结

【Java多线程编程核心技术】6.单例模式与多线程-笔记总结

【Java多线程编程核心技术】7.拾遗增补-笔记总结

定时器Timer的使用

Time类的主要作用就是设置计划任务,但封装任务的类却是TimerTask类(抽象类)

方法schedule(TimerTask task,Date time)

作用:在指定的日期执行一次某任务;

package test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Run1 {
private static Timer timer = new Timer();
//    private static Timer timer = new Timer(true);
static public c
4000
lass MyTask extends TimerTask {
@Override
public void run() {
System.out.println("运行了!时间为:" + new Date());
}
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2017-11-22 19:43:10";
Date dateRef = sdf.parse(dateString);
System.out.println("字符串时间:" + dateRef.toLocaleString() + " 当前时间:"
+ new Date().toLocaleString());
timer.schedule(task, dateRef);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
输出结果:
字符串时间:2017-11-22 19:43:10 当前时间:2017-11-22 19:43:05
运行了!时间为:Wed Nov 22 19:43:10 CST 2017


private static Timer timer = new Timer(true); 表示将新建的Timer()改成守护线程Daemon

如何执行任务的时间早于当前时间,则立即执行 task任务

Timer中运行有多个TimerTask任务

timer.schedule(task1,dateRef1);
timer.schedule(task2,dateRef1);


TimerTask是以队列的方式一个一个被顺序执行的,如果前面的任务消耗时间较长,则后面的任务运行的时间也会被延迟

方法schedule(TimerTask task,Date firstTime,long period)

作用:在指定的日期之后,按指定的间隔周期性地无限循环地执行某一个任务。

package test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Run {
static public class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("运行了!时间为:" + new Date());
}
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2014-10-12 09:12:00";
Timer timer = new Timer();
Date dateRef = sdf.parse(dateString);
System.out.println("字符串时间:" + dateRef.toLocaleString() + " 当前时间:"
+ new Date().toLocaleString());
timer.schedule(task, dateRef, 4000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
输出结果:
字符串时间:2017-11-22 19:51:30 当前时间:2017-11-22 19:51:18
运行了!时间为:Wed Nov 22 19:51:30 CST 2017
运行了!时间为:Wed Nov 22 19:51:34 CST 2017
运行了!时间为:Wed Nov 22 19:51:38 CST 2017
......


执行时间早于当前时间时,则立即执行。

任务执行时间被延时

例如在run(){… sleep(5000) …} 而timer.schedule(taskA,dateRef,4000);

一个一个顺序运行,但间隔为5000毫秒

TimerTask类的cancel()方法

作用:将自身从任务队列中清除,其他任务不收影响

Timer类的cancel()方法

作用:将任务队列中的全部任务清空

方法schedule(TimerTask task,long delay)

作用:以当前时间为参考时间,在此基础上延迟指定毫秒数后执行一次TimerTask任务。

方法schedule(TimerTask task,long delay,long period)

作用:以当前时间为参考时间,在此时间基础上延迟指定的毫秒数,再以某一间隔时间无限次数地执行某一个任务。

方法scheduleAtFixedRate(TimerTask task,Date firstTime,long period)

在不延时的情况下

schedule方法:下一次任务的执行时间参考上一次任务的“开始”时间,不具有追赶执行性

scheduleAtFixedRate方法:参考上一次任务的结束时间,具有追赶执行性。(如下图:)

package test.run;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Run6 {
private static Timer timer = new Timer();
static public class MyTask1 extends TimerTask {
@Override
public void run() {
System.out.println("1 begin 运行了!时间为:" + new Date());
System.out.println("1   end 运行了!时间为:" + new Date());
}
}
public static void main(String[] args) {
try {
MyTask1 task1 = new MyTask1();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString1 = "2017-11-22 20:08:30";
Date dateRef1 = sdf1.parse(dateString1);
System.out.println("字符串1时间:" + dateRef1.toLocaleString() + " 当前时间:"
+ new Date().toLocaleString());
timer.scheduleAtFixedRate(task1, dateRef1, 5000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
输出结果:
字符串1时间:2017-11-22 20:08:30 当前时间:2017-11-22 20:08:46
1 begin 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1 begin 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1 begin 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1 begin 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1 begin 运行了!时间为:Wed Nov 22 20:08:50 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:08:50 CST 2017
1 begin 运行了!时间为:Wed Nov 22 20:08:55 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:08:55 CST 2017
1 begin 运行了!时间为:Wed Nov 22 20:09:00 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:09:00 CST 2017
........


在计划时间早于当前时间时,立即执行!而且两个时间段内所对应的Task任务被“补充性”执行了,也就是Task任务追赶执行的特性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: