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

本文共 2540 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    nodejs生成多层目录和生成文件的通用方法
    查看>>
    nodejs端口被占用原因及解决方案
    查看>>
    Nodejs简介以及Windows上安装Nodejs
    查看>>
    nodejs系列之express
    查看>>
    nodejs系列之Koa2
    查看>>
    Nodejs连接mysql
    查看>>
    nodejs连接mysql
    查看>>
    NodeJs连接Oracle数据库
    查看>>
    nodejs配置express服务器,运行自动打开浏览器
    查看>>
    NodeMCU教程 http请求获取Json中文乱码解决方案
    查看>>
    Nodemon 深入解析与使用
    查看>>
    NodeSession:高效且灵活的Node.js会话管理工具
    查看>>
    node~ http缓存
    查看>>
    node不是内部命令时配置node环境变量
    查看>>
    node中fs模块之文件操作
    查看>>
    Node中同步与异步的方式读取文件
    查看>>
    node中的get请求和post请求的不同操作【node学习第五篇】
    查看>>
    Node中的Http模块和Url模块的使用
    查看>>
    Node中自启动工具supervisor的使用
    查看>>
    Node入门之创建第一个HelloNode
    查看>>