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

    总结

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

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

    你可能感兴趣的文章
    Python 多处理 Numpy 随机
    查看>>
    Python 多处理 >= 125 列表永远不会完成
    查看>>
    Python 多处理:在第一个子错误时中止映射
    查看>>
    Python 多处理不断产生 pythonw.exe 进程而不做任何实际工作
    查看>>
    Python 多处理从不加入
    查看>>
    Python 多处理如何优雅地退出?
    查看>>
    Python 多处理将子进程的标准输出重定向到 Tkinter 文本
    查看>>
    Python 多处理库错误(AttributeError:__exit__)
    查看>>
    Python 多处理模块的 .join() 方法到底在做什么?
    查看>>
    python 多线程与GIL
    查看>>
    python 字符串中特定字符替换,截取
    查看>>
    Python 字符串总结
    查看>>
    python 字符串显示中文_Python字符串开头的b"、u"、r"与中文乱码
    查看>>
    Python 字符串的几种拼装方式
    查看>>
    python 存入数据库bigint_python基础_MySQL的bigint类型
    查看>>
    python 学习 面向对象编程
    查看>>
    Python 学习日记第三篇 -- 字典
    查看>>
    Python 学习笔记(一)Data type
    查看>>
    python 安装echarts
    查看>>
    python 安装opencv及问题解决
    查看>>