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

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

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

    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);
    }
}
目录
打赏
0
0
0
0
2
分享
相关文章
Emgu.CV 报错 Emgu.CV.Util.CvException: OpenCV
Emgu.CV 报错 Emgu.CV.Util.CvException: OpenCV 异常信息:Emgu.CV.Util.CvException: OpenCV: 在 Emgu.CV.CvInvoke.CvErrorHandler(Int32 status, IntPtr funcName, IntPtr errMsg, IntPtr fileName, Int32 line, I...
282 1
一款开源的宝藏聊天机器人Typebot
Typebot 是一个强大的开源聊天机器人框架,支持多种 AI 模型,包括 Claude 3.5 和 Dify.AI 助手,适用于客服、电商推荐等场景。它通过 Webhook 块实现与外部服务的交互,帮助开发者轻松创建和管理对话式 AI 应用。通过阿里云账号登录,即可快速创建和部署自己的聊天机器人。
|
8月前
|
获取IDE的API文档
获取IDE的API文档
224 5
React 分页组件 Pagination
本文介绍了如何在 React 中实现分页组件,从基础概念到常见问题及解决方案。分页组件用于将大量数据分成多个页面,提升用户体验。文章详细讲解了分页组件的基本结构、快速入门步骤、以及如何处理页面跳转不平滑、页码过多导致布局混乱、边界条件处理和数据加载延迟等问题。通过本文,读者可以全面了解并掌握 React 分页组件的开发技巧。
148 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
330 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
8月前
|
UED
淘宝上货接口(淘宝发货接口)
淘宝上货接口是商家实现订单发货和物流跟踪的重要工具,可自动化处理订单,减少人工错误,提升用户体验。本文从接口概述、功能、使用方法及优缺点四方面详细介绍。
超越普通Java开发者:掌握抽象类与接口的高级技巧!
【6月更文挑战第17天】在Java编程中,抽象类和接口是提升代码质量和可维护性的核心要素。通过抽象类实现基类定制,如预设实现并强制子类实现特定方法;接口则提供多继承及默认、静态方法,增强复用和模块化。两者结合使用,抽象类封装状态和行为,接口专注行为契约,利于单元测试中的模拟对象创建。掌握这些技巧,能助你编写出更优雅、高效的代码。
105 0
开放式API在AI应用开发中的革命性角色
【7月更文第21天】随着人工智能技术的飞速发展,开放式API(Application Programming Interfaces)正逐渐成为连接技术与创新、加速AI应用开发的关键桥梁。这些API允许开发者轻松访问预先训练好的模型和复杂算法,无需从零开始构建基础架构,从而极大地降低了AI应用的开发门槛,促进了技术民主化。本文将探讨开放式API如何在AI领域引发革命性变化,通过实际案例和代码示例展现其强大功能。
451 2
深入理解 Nginx 与 Kong 的配置与实践
在微服务架构中,Nginx 用于配置负载均衡,如示例所示,定义上游`pay-service`包含不同权重的服务节点。Kong API 网关则通过service和route进行服务管理和路由,与Nginx的upstream和location类似。通过Kong的命令行接口,可以创建upstream、target、service和route,实现对后端服务的负载均衡和请求管理。Nginx和Kong协同工作,提供高效、灵活的API管理和流量控制。
387 1
深入理解 Nginx 与 Kong 的配置与实践
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问