JAVA进阶 THREAD学习10 多线程案例--计时器

标准库中计时器的使用

  • Timer类的实例化对象
  • TimerTask类的是实例化对象–在run方法中存放运行的代码
  • 延迟的时间(相对时间,相对于当前时间之后的多少毫秒等)

时间需要安排schedule

public static void main(String[] args) {
        System.out.println("From now on,after 4s will print a word");
        Timer timer=new Timer();
        timer.schedule(new TimerTask(){
            public void run(){
                System.out.println("LOVE");
            }
        },4000);
    }

自定义一个计时器

基本构成

  • 两量

    • PriorityBlockingQueue
    • Object mailBox
  • 两类

    • MyTimeTask
    • Worker
  • 两方法

    • MyTimer()
    • schedule()

两量

  • PriorityBlockingQueue

计时器的核心,使用优先级队列来存储计时器执行的基本单位TimeTask,因为需要按照时间顺序一一执行对应的Task

         private PriorityBlockingQueue<Task> queue = new PriorityBlockingQueue();
  • Object mailBox

协调线程和work线程等待的同步对象,为实现多线程顺序执行提供锚点(“系铃人”)。

        private Object mailBox = new Object();

两类

  • MyTimeTask

计时器的基本单元
两变量
- Runnable command(需要特定时间执行的代码)
- long time(用于存储绝对时间)
三方法
- 构造方法(存储执行代码,将存入的相对时间转换为绝对时间)

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

            public Task(Runnable command, long time) {
                this.command = command;
// time 中存的是绝对时间, 超过这个时间的任务就应该被执行
                this.time = System.currentTimeMillis() + time;
            }

            public void run() {
                command.run();
            }

            @Override
            public int compareTo(Task o) {
// 谁的时间小谁排前面
                return (int) (time - o.time);
            }
        }
  • Worker

继承于线程,用于执行相关的代码

class Worker extends Thread {
            @Override
            public void run() {
                while (true) {
                    try {
                        Task task = queue.take();
                        long curTime = System.currentTimeMillis();
                        if (task.time > curTime) {
// 时间还没到, 就把任务再塞回去
                            queue.put(task);
                            synchronized (mailBox) {
// 指定等待时间 wait
                                mailBox.wait(task.time - curTime);
                            }
                        } else {
// 时间到了, 可以执行任务
                            task.run();
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        break;
                    }
                }
            }
        }

两方法

  • MyTimer()

构造方法,启动运行代码的work

public MyTimer() {
// 启动 worker 线程
            Worker worker = new Worker();
            worker.start();
        }

        // schedule 原意为 "安排"
        public void schedule(Runnable command, long after) {
            Task task = new Task(command, after);
            queue.offer(task);
            synchronized (mailBox) {
                mailBox.notify();
            }
        }
  • schedule()

“安排”方法,用于添加新的执行代码和相对等待时间

public void schedule(Runnable command, long after) {
            Task task = new Task(command, after);
            queue.offer(task);
            synchronized (mailBox) {
                mailBox.notify();
            }
        }
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值