博客
关于我
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/

    你可能感兴趣的文章
    Oracle BEQ方式连接配置
    查看>>
    oracle Blob保存方式,oracle 存储过程操作blob
    查看>>
    Oracle BMW Racing sailing vessel帆船图
    查看>>
    ORACLE Bug 4431215 引发的血案—原因分析篇
    查看>>
    Oracle Business Intelligence Downloads
    查看>>
    Oracle cmd乱码
    查看>>
    Oracle Corp甲骨文公司推出Oracle NoSQL数据库2.0版
    查看>>
    Oracle DBA课程系列笔记(20)
    查看>>
    oracle dblink 创建使用 垮库转移数据
    查看>>
    oracle dblink结合同义词的用法 PLS-00352:无法访问另一数据库
    查看>>
    Oracle dbms_job.submit参数错误导致问题(ora-12011 无法执行1作业)
    查看>>
    oracle dg switchover,DG Switchover fails
    查看>>
    Oracle E-Business Suite软件 任意文件上传漏洞(CVE-2022-21587)
    查看>>
    Oracle EBS OPM 发放生产批
    查看>>
    Oracle EBS-SQL (BOM-15):检查多层BOM(含common BOM).sql
    查看>>
    Oracle EBS环境下查找数据源(OAF篇)
    查看>>
    oracle Extract 函数
    查看>>
    uni-app开发环境自动部署的一个误区(App running at...)
    查看>>
    Oracle GoldenGate Director安装和配置(无图)
    查看>>
    Oracle Goldengate在HP平台裸设备文件系统OGG-01028处理
    查看>>