简单的计时器代码

本文深入探讨了使用Java实现定时任务的方法,通过自定义Worker线程和PriorityBlockingQueue队列来管理并执行任务。详细讲解了Task类如何比较执行时间,以及Timer类如何调度任务。
package 定时器;

import java.util.concurrent.PriorityBlockingQueue;

public class Test2 {

    static class Task implements Comparable<Task>{
        private Runnable command;
        private long time;

        public Task(Runnable command, long after) {
            this.command = command;
            this.time = System.currentTimeMillis() + after;
            //多少时间后这个任务去执行
        }

        //command 表示这个命令
        public void run() {
            command.run();//表示这个命令如何去执行
        }

        //引入比较的方法,还是为了看那个任务是最先执行的
        //
        @Override
        public int compareTo(Task o) {
            return  (int) (this.time - o.time);
        }
    }

    static class Worker extends Thread{
        private PriorityBlockingQueue<Task> queue= null;
        private Object mailBox = null;

        public Worker (PriorityBlockingQueue<Task> queue, Object mailBox) {
            this.queue = queue;
            this.mailBox = mailBox;
        }

        @Override
        public void run() {
            //具体线程如何实现
            while (true) {
                try {
                    Task task = queue.take();
                    Long curTime = System.currentTimeMillis();
                    if (task.time > curTime) {
                        queue.put(task);
                        synchronized (mailBox) {
                            mailBox.wait(task.time - curTime);
                        }
                    } else {
                        task.run();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }



    static class Timer {

        //构建一个阻塞优先队列去排序这个任务
        private PriorityBlockingQueue<Task> q = new PriorityBlockingQueue<>();

        //构造方法
        //需要一个线程去循环扫面队首元素,是否到时间点
        //如果到了时间点才会去执行
        private Object mailBox = new Object();
        public Timer() {
            Worker worker = new Worker(q,mailBox);
            worker.start();
        }

        //需要一个方法将task安排进入队列
        public void schedule (Runnable command, long after) {
            Task task = new Task(command,after);
            q.put(task);
            synchronized (mailBox) {
                mailBox.notify();
                //当安排新任务后,唤醒等待,看这个新任务是否进入队首
                //若是进入队首,则会对这个新任务进行wait或者执行这个任务
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值