目录
一. 什么是定时器?
二. java中的定时器类
三. 定时器的简单使用.
四. 模拟实现定时器
4.1 实现 MyTimerTask
4.2 实现 MyTimer
一. 什么是定时器?
定时器相当于闹钟, 时间到了就执行一些逻辑.
二. java中的定时器类
使用Timer类实例化一个定时器对象.
Timer类中的核心方法: schedule(TimerTask, long);
TimerTask是一个抽象方法, 实现了Runnable接口, 重写了run抽象方法.
三. 定时器的简单使用.
public static void main(String[] args) throws InterruptedException{Timer timer = new Timer();// lambda: 函数式接口, 接口中有且仅有一个抽象方法timer.schedule(new TimerTask() { // 匿名内部类@Overridepublic void run() {System.out.println(1000);}}, 1000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println(2000);}}, 2000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println(3000);}}, 3000);System.out.println("main");Thread.sleep(3000);timer.cancel(); // 终止timer中的前台线程}
cancel()方法用来终止timer类中的前台线程.
四. 模拟实现定时器
4.1 实现 MyTimerTask
class MyTimerTask implements Comparable<MyTimerTask> {private Runnable task;// 记录任务要执行的时刻private long time;public MyTimerTask(Runnable task, long time) {this.task = task;this.time = time;}@Overridepublic int compareTo(MyTimerTask o) {return (int) (this.time - o.time);// return (int) (o.time - this.time);}public long getTime() {return time;}public void run() {task.run();}
}
4.2 实现 MyTimer
class MyTimer {private PriorityQueue<MyTimerTask> queue = new PriorityQueue<>();// 直接使用 this 作为锁对象, 当然也是 ok 的private Object locker = new Object();public void schedule(Runnable task, long delay) {synchronized (locker) {// 以入队列这个时刻作为时间基准.MyTimerTask timerTask = new MyTimerTask(task, System.currentTimeMillis() + delay);queue.offer(timerTask);locker.notify();}}public MyTimer() {// 创建一个线程, 负责执行队列中的任务Thread t = new Thread(() -> {try {while (true) {synchronized (locker) {// 取出队首元素// 还是加上 whilewhile (queue.isEmpty()) {// 这里的 sleep 时间不好设定!!locker.wait();}MyTimerTask task = queue.peek();if (System.currentTimeMillis() < task.getTime()) {// 当前任务时间, 如果比系统时间大, 说明任务执行的时机未到locker.wait(task.getTime() - System.currentTimeMillis());} else {// 时间到了, 执行任务task.run();queue.poll();}}}} catch (InterruptedException e) {e.printStackTrace();}});t.start();}
}