如何实现一个“定时器”

本文介绍了如何使用Java实现一个简单的定时器,通过定义Task类来描述任务和执行时间,使用阻塞优先队列来组织任务并由扫描线程检查执行时间。文章还探讨了解决‘忙等’问题的方法,利用等待集和锁机制优化资源占用。
摘要由CSDN通过智能技术生成

定时器是多线程编程中的一个重要且常用的组件,顾名思义,定时器好比一个闹钟一样,必须得等指定时间到了才会去执行任务。那么我们该如何来实现一个简单的定时器呢

首先我们来认识一下定时器的构成

  1. 使用一个Task类来描述一段逻辑,也就是要执行的任务,并且记录好这个任务在什么时候来执行。
  2. 使用一个阻塞优先队列来组织若干个Task,使用优先队列就是为了保证队首的任务就是最早需要被执行的那个任务
  3. 还需要一个扫描线程,来时刻扫描是否有任务的执行时间到了。如果到了就去执行这个任务。

下面我们来看具体代码

public class ThreadDemo20 {//定时器
    static class Task implements  Comparable<Task> {
        @Override
        public int compareTo(Task o) {
            return (int) (this.time - o.time);
        }
        static  Runnable command;
        private long time;//表示啥时候来执行commad。
        public Task(Runnable command,long after){//after表示多少毫秒之后执行,是相对时间
            this.command = command;
            this.time = System.currentTimeMillis()+after;//也就是说这个任务的执行时间等于执行到这段代码的时间加上我们指定的时间
        }
        public void run() {//可以借助run方法来描述要执行的具体任务是什么
            command.run();
        }
        //由于优先队列中涉及比较规则&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值