实现定时器

前言

在现代软件开发中,定时任务是一项非常重要的功能。无论是数据备份、自动化报告生成还是周期性任务,定时器都是不可或缺的工具。

在Java中,我们可以使用内置的 java.util.timer 和 java.util.TimerTimerTask 类来实现定时任务。本篇博客将详细介绍如何使用Java定时器来创建各种定时任务,并提供实例演示。


1. 定时器基础

在使用Java定时器之前,我们需要了解两个基本的概念:' Timer ' 和 ' TimerTask '。

Timer类:Timer类是Java中用于执行定时任务的核心类。它可以安排任务在指定的时间开始运行,也可以按照固定的时间间隔周期性地执行任务。

TimerTask类:类是一个抽象类,它实现了 Runnable 接口。我们可以通过继承 TimeTask 类来创建自定义的定时任务。


2. 使用Timer和TimerTask

首先,我们需要创建一个Timer对象,并通过该对象的schedule()方法来安排定时任务:

import java.util.Timer;
import java.util.TimerTask;

public class MyTimerTask extends TimerTask {
    @Override
    public void run() {
        // 定时任务的具体逻辑
        System.out.println("定时任务执行中...");
    }

    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask myTask = new MyTimerTask();

        // 在延迟1秒后,每隔2秒执行一次任务
        timer.schedule(myTask, 1000, 2000);
    }
}

在这个例子中,MyTimerTask类继承自TimerTask,并实现了run()方法,该方法中定义了定时任务的具体逻辑。在main()方法中,我们创建了一个Timer对象,并使用schedule()方法安排了定时任务的执行。


3. 实现定时器

1. 需要一个类,通过类对象来描述一个任务(至少包含任务内容和时间)

2. 需要一个Timer类(Timer中有一个线程,扫描任务是否到时间,可以执行了)

3. 需要有一个数据结构,把所有的任务都存起来(优先级队列)

1. 模拟实现  TimerTask

// 模拟TimerTask(定时器任务)
class MyTimerTask implements Comparable{
    // 要执行的任务
    private Runnable runnable;
    // 执行任务的时间
    private long time;

    //模拟 TimerTask 函数
    public MyTimerTask(Runnable runnable,long delay) {
        this.runnable = runnable;
        this.time = System.currentTimeMillis() + delay;
    }

    @Override
    public int compareTo(MyTimerTask o) {
        // 让队首元素是最小的元素
        return (int)(this.time-o.time);
    }

    public Long getTime() {
        return time;
    }

    public Runnable getRunnable() {
        return runnable;
    }
}

2. 模拟实现定时器

// 模拟定时器  
class MyTimer {

    private Object obiect = new Object();
    // 使用一个数据结构,保存任务数据(优先级队列)
    private PriorityQueue queue = new PriorityQueue<>();

    // 实现 schedule(时间表) 函数
    public void schedule(Runnable runnable, long delay) {
        synchronized (obiect) {
            queue.offer(new MyTimerTask(runnable, delay));
            obiect.notify();
        }
    }

    // 扫描线程
    public MyTimer() {
        Thread t = new Thread(() -> {
            // 不停的扫描队首,观察是否到时间
            while (true) {
                synchronized (obiect) {
                    // 队列为空的时候,阻塞等待
                    while (queue.isEmpty()) {

                        try {

                            obiect.wait();

                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }

                    }
                    MyTimerTask task = queue.peek();
                    // 比较队首元素是否可以执行了
                    long curTime = System.currentTimeMillis();
                    if (curTime >= task.getTime()) {
                        // 达到的话开始执行任务 执行完删除
                        task.getRunnable().run();
                        queue.poll();
                    }else {

                        try {

                            obiect.wait(task.getTime() - curTime);

                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }

                }
            }
        });
        t.start();
    }


}

结语

通过本篇博客,我们学习了如何使用Java的定时器来执行各种定时任务。无论是简单的周期性任务还是复杂的定时调度,Java定时器都能够满足我们的需求。希望本文能够帮助你更好地理解和使用Java定时器,提高你的编程效率。

希望这篇文章对你有所帮助!如果你有任何问题或建议,欢迎在下方留言。谢谢阅读!

你可能感兴趣的:(javaEE,java,java-ee,开发语言)