详解 定时器
(请观看本人博文 —— 《详解 多线程》)
概述:
定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务 通过 后台线程的方式执行。
在Java中,可以通过 Timer类和 TimerTask类 来实现定义调度的功能。
那么,本文对这两个类进行讲解
首先是 Timer类:
Timer类:
概述:
线程的一个组件,为在后台线程中的未来执行调度任务。
任务可能被安排为一次性执行,或定期重复执行。
那么,现在,本人来展示下这个类的 构造方法:
构造方法:
- Timer()
创建一个新的计时器- Timer(boolean isDaemon)
创建一个新的定时器的线程可以被指定 run as a daemon- Timer(String name)
创建一个新的计时器,该计时器的关联线程具有指定的名称- Timer(String name, boolean isDaemon)
创建一个新的定时器的相关线程指定名称,可以指定 run as a daemon
现在,本人来展示下这个类的 常用API:
常用API:
- void cancel()
终止此计时器,丢弃任何当前计划的任务- int purge()
从这个计时器的任务队列中移除所有已取消的任务- void schedule(TimerTask task, Date time)
在指定的时间计划执行指定的任务- void schedule(TimerTask task, Date firstTime, long period)
计划重复固定延迟执行指定的任务,开始在指定的时间- void schedule(TimerTask task, long delay)
指定在指定的延迟后执行指定的任务的时间- void schedule(TimerTask task, long delay, long period)
计划重复固定延迟执行指定的任务,在指定的延迟后开始- void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
计划重复固定利率执行指定的任务,开始在指定的时间- void scheduleAtFixedRate(TimerTask task, long delay, long period)
计划重复固定利率执行指定的任务,在指定的延迟 后开始
由于 Timer类的对象必须要一个 TimerTask类的对象,才能使用,所以,本人在讲解完 TimerTask类后再来展示这两个类的使用。
那么,现在,本人来讲解下 TimerTask类:
TimerTask类:
概述:
可以由定时器 一次性 或 重复 执行的任务
构造方法:
- protected TimerTask():
创建一个新的计时器任务
常用API:
- boolean cancel()
取消此计时器任务- abstract void run()
此计时器任务执行的动作- long scheduledExecutionTime()
返回该任务的最新实际的执行预定执行时间
那么,现在,本人来通过两个例子,来展示下这两个类的使用:
应用展示:
例1:
题目:
这天高木同学又有了戏耍西片同学的主意:
她提出要和西片同学比细心 —— 用电脑计时,两个人互相数6.66s,时间到了就要向对方发送“时间到了呦~”,谁最靠近6.66s,谁就赢了
西片同学一听就乐了,细心,不正是西片同学最擅长的嘛,于是就和高木同学定下赌约。而高木同学已经想好了用一套代码来计时,那么,同学们,你们知道这套代码的大致思路吗?
要求:
编写一套代码,每隔6.66s,让控制台输出字符串"时间到了呦~",一共输出5次
那么,本人来展示下代码:
代码实现:
首先是 自定义定时器任务类:
package edu.youzg.about_timer.core;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
Timer timer;
static int count = 0;
public MyTimerTask(Timer timer) {
this.timer=timer;
}
@Override
public void run() {
if (count++ < 5) {
System.out.println("时间到了呦~");
} else {
timer.cancel();
}
}
}
现在,本人来给出测试类:
package edu.youzg.about_timer.core;
import java.util.Timer;
public class Test {
public static void main(String[] args){
Timer timer = new Timer();
//延迟6660毫秒之后,让定时任务执行,每隔6660毫秒执行一次
MyTimerTask myTimerTask = new MyTimerTask(timer);
timer.schedule(myTimerTask,6660, 6660);
}
}
现在,本人来展示下运行结果:
由于本人没录视频,所以只能展示结束后的运行结果,若是抱有怀疑的同学自己运行下上面的代码即可!
例2:
题目:
每年2.14号是情人节,王小明和小樱不再一座城市,但是想在当地2.14号的0:00给小樱说声“桜、バレンタインデーの楽しみ、私は永遠にあなたを愛します”,但是害羞的他怕到时候纠结。
要求:
编写一套程序,在编译后,当时间到指定日期的指定时刻从控制台输出字符串"桜、バレンタインデーの楽しみ、私は永遠にあなたを愛します".
代码实现:
首先,本人来给出一个 自定义定时器任务类:
package edu.youzg.about_timer.core;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
Timer timer;
public MyTimerTask(Timer timer) {
this.timer=timer;
}
@Override
public void run() {
System.out.println("桜、バレンタインデーの楽しみ、私は永遠にあなたを愛します");
timer.cancel();//取消定时器
}
}
现在,本人来给出一个测试类:
package edu.youzg.about_timer.core;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
public class Test {
public static void main(String[] args) throws ParseException {
Timer timer = new Timer();
String dateStr = "2020-02-16 21:11:00"; //由于2.14已经过了,本人要是等的话,就到明年了,所以,就自己设置了一个合理的时间
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateStr);
MyTimerTask myTimerTask = new MyTimerTask(timer);
timer.schedule(myTimerTask,date);
}
}
首先,本人来展示下时间:
现在,本人来展示下这一时刻控制台的状态:
可以看到,在本人指定的时间输出了指定的结果!
那么,想要了解底层源码实现的同学,可以观看如下博文:
源码剖析:
请观看博文 —— 《【源码剖析】定时器 详解》
那么,至此,定时器的相关知识点就讲解完毕了!
本人也在后续博文中,自己实现了定时器 —— 《详解 定时器 的基本实现》
希望同学们能有所启发!
(本人 《详解 多线程》 博文 链接:https:////www.cnblogs.com/codderYouzg/p/12418935.html)