IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java实现定时器 -> 正文阅读

[Java知识库]Java实现定时器

//创建一个类,表示定时器
class MyTimer {
    //创建一个静态内部类,用来表示任务
    static class MyTask implements Comparable<MyTask> {
        //类成员,表示任务内容
        private Runnable runnable;
        //类成员,表示任务执行时间
        private long time;
        //给定一个构造方法,在构造时需指定任务内容和多长时间后执行
        public MyTask(Runnable runnable, long delay) {
            this.runnable = runnable;
            this.time = System.currentTimeMillis() + delay;
        }
        //类方法,获取该任务的执行时间
        public long getTime() {
            return time;
        }
        //类方法,执行该任务
        public void run() {
            runnable.run();
        }
        //任务需要组织在优先级队列中,故需要实现Comparable接口中的compareTo方法
        @Override
        public int compareTo(MyTask o) {
            return (int)(this.time - o.time);
        }
    }
    //创建一个阻塞优先级队列,用来组织定时器中的各个任务,由于时间小的任务排在前面,故使用带有优先级的队列组织任务
    public PriorityBlockingQueue<MyTask> queue = new PriorityBlockingQueue<>();
    //向优先级队列中添加任务
    public void schedule(Runnable runnable, long delay) {
        MyTask myTask = new MyTask(runnable, delay);
        queue.offer(myTask);
        //有新任务添加时,需要解除wait,让扫描线程重新检查队列中队首任务的触发时间
        synchronized (locker) {
            locker.notify();
        }
    }
    //创建一个锁对象,借助这个对象解决扫描线程忙等问题,缓解CPU占用过高
    private Object locker = new Object();
    public MyTimer() {
        //创建扫描线程
        Thread t = new Thread(() -> {
            while (true) {
                try {
                    MyTask task = queue.take();
                    long curtime = System.currentTimeMillis();
                    //当前时间小于触发事件,则阻塞等待,并指定一个等待时间
                    if (curtime < task.time) {
                        queue.offer(task);
                        synchronized (locker) {
                            locker.wait(task.time - curtime);
                        }
                    } else {
                        //时间到了,就执行任务
                        task.run();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        });
        t.start();
    }
}
public class Demo6 {
    public static void main(String[] args) {
        MyTimer timer = new MyTimer();
        timer.schedule(() -> {
            System.out.println("hello world!");
        },3000);
        System.out.println("hello main!");
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:26:14  更:2022-05-09 12:26:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:14:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码