博客
关于我
Java如何简单实现一个定时器
阅读量:616 次
发布时间:2019-03-13

本文共 2488 字,大约阅读时间需要 8 分钟。

一个定时器是用于在指定时间后执行某个任务的工具。它类似于一个闹钟,可以帮助你在特定的时间点执行紧急任务。编写自己的定时器虽然可能有点复杂,但能深入理解定时任务的实现原理。

实现一个简易定时器的步骤

为了创建一个简单的定时器,我们需要定义一个 Timer 类和一个 Worker 类来管理定时任务的执行。

1. 定义 Timer 类

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);    }}

2. 定义 Worker 类

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(); } }}

3. 测试用例

展示如何使用定时器。

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 的内部机制,确保读写操作的安全性。
    • 任务管理:提供简单的任务排队和执行机制,适合单线程和多线程环境。
    • 灵活性:允许用户根据需要定义不同的延迟时间和任务内容。

    总结

    通过定义 TimerWorker 类,我实现了一个简单的定时任务框架。这个框架能够按指定时间执行任务,但在实际应用中可能需要进一步优化,尤其是在处理多线程和高并发场景时。

    转载地址:http://tgtaz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现维吉尼亚密码加解密算法(附完整源码)
    查看>>
    Objective-C实现维吉尼亚密码加解密算法(附完整源码)
    查看>>
    Objective-C实现缓冲区(附完整源码)
    查看>>
    Objective-C实现缺陷的检测和识别加上自动矩形框(附完整源码)
    查看>>
    Objective-C实现罗马数字转十进制算法(附完整源码)
    查看>>
    Objective-C实现置换密码加解密算法(附完整源码)
    查看>>
    Objective-C实现置换密码加解密算法(附完整源码)
    查看>>
    Objective-C实现翻转图像augmentation算法(附完整源码)
    查看>>
    Objective-C实现老鼠迷宫算法(附完整源码)
    查看>>
    Objective-C实现聚类基本K均值算法(附完整源码)
    查看>>
    Objective-C实现莱布尼兹级数求解π的近似值(附完整源码)
    查看>>
    Objective-C实现获取 Collatz 序列长度算法(附完整源码)
    查看>>
    Objective-C实现获取CPU温度(附完整源码)
    查看>>
    Objective-C实现获取GPU显卡信息(附完整源码)
    查看>>
    Objective-C实现获取HID设备列表 (附完整源码)
    查看>>
    Objective-C实现获取PE文件特征(附完整源码)
    查看>>
    Objective-C实现获取文件大小(字节数) (附完整源码)
    查看>>
    Objective-C实现获取文件头的50个字符(附完整源码)
    查看>>
    Objective-C实现获取文件最后修改时间(附完整源码)
    查看>>
    Objective-C实现获取文件末的50个字符(附完整源码)
    查看>>