实现定时器(基于标准库提供的定时器、基于优先级队列自实现的定时器)

简介: 实现定时器(基于标准库提供的定时器、基于优先级队列自实现的定时器)

一、基于标准库提供的定时器

    public static void main(String[] args) {
        //Timer类就是标准库提供的定时器
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("定时器任务3");
            }
        },3000);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("定时器任务2");
            }
        },2000);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("定时器任务1");
            }
        },1000);
    }

二、基于优先级队列自实现的定时器

//这个类表示一个定时器中的任务
class MyTask implements Comparable<MyTask>{
     //要执行的任务
    private Runnable runnable;
    //该任务在什么时候后执行
    private Long time;
    //提供有参构造方法
    public MyTask(Runnable runnable, Long time) {
        this.runnable = runnable;
        this.time = time;
    }
    //提供time的Get方法
    public Long getTime() {
        return time;
    }
    //执行任务
    public void run(){
        runnable.run();
    }
    @Override
    public int compareTo(MyTask o) {
        return (int) (this.time - o.time);
    }
}
//自实现的定时器
class MyTimer{
    //专门一个线程来扫描是否已经到时间了
    private Thread t = null;
    //专门一个阻塞优先级队列来保存任务
    private PriorityBlockingQueue<MyTask> queue = new PriorityBlockingQueue<>();
    public MyTimer(){
        t = new Thread(()->{
           while (true){
               synchronized (this){
                   try {
                       MyTask myTask = queue.take();
                       long curTime = System.currentTimeMillis();
                       if (curTime < myTask.getTime()){
                           //还没到时间,继续放回队列,这里再算一下需要等待的时间,避免忙等
                           queue.put(myTask);
                           this.wait(myTask.getTime() - curTime);
                       }else {
                           //时间到了
                           myTask.run();
                       }
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
           }
        });
        t.start();
    }
    // 第一个参数是 任务 内容
    // 第二个参数是 任务 在多少毫秒之后执行
    // 把任务加入队列
    public void schedule(Runnable runnable,Long after){
        MyTask myTask = new MyTask(runnable,System.currentTimeMillis()+after);
        queue.put(myTask);
    //这里是每次新加入一个任务,都要去唤醒,再次重新计算需要等待的时间
        synchronized (this){
            this.notify();
        }
    }
}
public class ThreadDemo24 {
    public static void main(String[] args) {
        MyTimer myTimer = new MyTimer();
        myTimer.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("定时器任务3");
            }
        },3000L);
        myTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("定时器任务2");
            }
        },2000L);
        myTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("定时器任务1");
            }
        },1000L);
    }
}
相关文章
|
2月前
多线程(初阶八:计时器Timer)
多线程(初阶八:计时器Timer)
47 0
|
1月前
定时器
定时器
12 0
|
6月前
用555定时器接成的多谐振荡电路的介绍
用555定时器构建的多谐振荡电路 一、引言 多谐振荡电路是一种能够产生多个频率的振荡信号的电路结构。它在音乐合成器、电子琴等设备中有着广泛的应用。本文将介绍一种使用555定时器构建的多谐振荡电路。 二、555定时器简介 555定时器是一种经典的集成电路,由三个功能单元组成:比较器、RS触发器和放大器。它可以用作脉冲发生器、频率分频器、定时器等。在多谐振荡电路中,我们将利用555定时器的单稳态多谐振荡特性来实现多个频率的振荡。 三、电路设计 1. 电路原理 多谐振荡电路的基本原理是利用555定时器的单稳态多谐振荡特性。单稳态多谐振荡是指当555定时器处于单稳态时,输出信号的频率会随着电容和
175 0
|
4月前
|
C#
[C#] 定时器的使用
[C#] 定时器的使用
17 0
|
6月前
|
存储 算法
定时器/计数器应用的提高
定时器/计数器是数字电路中常用的功能模块,可以用于实现各种计时、计数和控制功能。提高定时器/计数器应用的关键在于深入理解其原理和功能,并结合具体应用场景进行合理设计和优化。以下是提高定时器/计数器应用的一些建议: 1. 熟悉定时器/计数器的工作原理: 了解定时器/计数器的工作原理是提高应用的基础。掌握定时器/计数器的计时和计数模式、时钟源选择、计数器位宽等相关知识,以及定时器/计数器的寄存器设置和控制方法。 2. 确定应用需求: 明确应用的具体需求,包括计时/计数的时间范围、精度要求、计数模式(递增/递减)、触发条件等。根据需求选择合适的定时器/计数器模块,并合理配置相关参数。 3. 时
28 0
|
9月前
扣奖(定时器)
扣奖(定时器)
33 0
|
11月前
|
Java 测试技术
在多线程中自定义实现定时器(Timer)
在多线程中自定义实现定时器(Timer)
|
前端开发 JavaScript
34、定时器
setTimeout函数用来指定某个函数或某段代码,在多少毫秒之后执行。
125 0
|
C#
C#中的三种定时器总结
C#中的三种定时器总结
331 0
C#中的三种定时器总结