本文共 2540 字,大约阅读时间需要 8 分钟。
一个定时器是用于在指定时间后执行某个任务的工具。它类似于一个闹钟,可以帮助你在特定的时间点执行紧急任务。编写自己的定时器虽然可能有点复杂,但能深入理解定时任务的实现原理。
为了创建一个简单的定时器,我们需要定义一个 Timer 类和一个 Worker 类来管理定时任务的执行。
Timer 类需要包含两个主要属性:
time:任务应在此时间点执行。runnable:任务。构造函数初始化这些属性,并设置定时量。
class Timer { long time; Runnable runnable; public Timer(Runnable runnable, long after) { this.runnable = runnable; this.time = System.currentTimeMillis() + after; } public void run() { runnable.run(); } @Override public int compareTo(Timer o) { return (int) (this.time - o.time); }} Worker 类负责管理定时任务的队列和执行线程。
PriorityBlockingQueue 存储 Timer 任务,优先处理时间早的任务。class Worker { PriorityBlockingQueue priorityBlockingQueue = new PriorityBlockingQueue<>(); Object lock = new Object(); public Worker() { Thread thread = new Thread(() -> { while (true) { try { Timer timer = priorityBlockingQueue.take(); if (timer.time <= System.currentTimeMillis()) { timer.run(); } else { synchronized (lock) { lock.wait(timer.time - System.currentTimeMillis()); } } } catch (InterruptedException e) { e.printStackTrace(); } } }); thread.start(); } public void schedule(Runnable runnable, long after) { Timer timer = new Timer(runnable, after); priorityBlockingQueue.put(timer); synchronized (lock) { lock.notify(); } }} 展示如何使用定时器。
public class ThreadDemo { public static void main(String[] args) { Worker worker = new Worker(); Runnable task = () -> { worker.schedule(this, 3000); System.out.println("任务已排程,时间:" + new Date()); }; worker.schedule(task, 3000); }} Worker 实例。Worker#schedule 方法添加任务,指定延迟时间。Timer 类: time 从当前时间开始计算延迟后的时间点。compareTo 方法用于比较两个 Timer 的执行时间,确保按时间顺序处理任务。Worker 类: PriorityBlockingQueue 存储定时任务,确保任务按优先级处理。PriorityBlockingQueue 的内部机制,确保读写操作的安全性。通过定义 Timer 和 Worker 类,我实现了一个简单的定时任务框架。这个框架能够按指定时间执行任务,但在实际应用中可能需要进一步优化,尤其是在处理多线程和高并发场景时。
转载地址:http://tgtaz.baihongyu.com/