Java多线程用Timer完成定时器简析

Timer是什么

是Java中的一个已经实现的方法,我们可以调用它为任务进行到点执行

举例

假如我有三个线程,要求在第一秒打印线程1,第二秒打印线程2,第三秒打印线程3

代码

import java.util.Timer;
import java.util.TimerTask;

public class demo8 {
//创建一个Timer实例对象,导包
    public static Timer timer = new Timer();

    public static void main(String[] args) {
        Thread t1 = new Thread(()->{
//schedule翻译过来"计划表"
//调用Timer方法中的计划表
//为其new一个TimerTask(任务计划)
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
//这里面写任务执行的内容
                    System.out.println("1");
                }
//这里写在程序开始后的第几ms开始执行上面的任务
            }, 1000);
        });
        Thread t2 = new Thread(()->{
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    System.out.println("2");
                }
            },2000);
        });
        Thread t3 = new Thread(()->{
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    System.out.println("3");
                }
            },3000);
        });
        t1.start();
        t2.start();
        t3.start();
    }
}


运行结果

再次解释一下Timer的使用Java多线程用Timer完成定时器简析_第1张图片

 模拟实现Timer

import java.util.concurrent.PriorityBlockingQueue;

//要执行的任务的属性
class MyTask implements Comparable {
    public Runnable runnable;
    public long time;

    public MyTask(Runnable runnable, long time) {
        this.runnable = runnable;
        this.time = System.currentTimeMillis()+time;//计算程序开始后多少秒开始执行任务(绝对时间)
    }

    @Override
    public int compareTo(MyTask o) {
        return (int) (this.time - o.time);
    }

}

public class MyTimer{
    private Object lock = new Object();
    private PriorityBlockingQueue queue= new PriorityBlockingQueue<>();
    public void schedule(Runnable runnable,long delay){

//将自己创建的任务和预计的时间放入优先阻塞队列里面

        MyTask myTask = new MyTask(runnable,delay);
        queue.put(myTask);
//防止忙等
        synchronized(lock){
        lock.notify();
    }
    }
    MyTimer(){
        Thread t = new Thread(()->{
            while(true){
                synchronized (lock){
                    try {
//取出预计最先执行的任务
                        MyTask myTask = queue.take();
//查看是否到达执行时间
                        long curTime = System.currentTimeMillis();
                        if(myTask.time <= curTime){
                            myTask.runnable.run();
                        }else{
//没有到达执行直接则从新放回,直到满足等待时间,wait被自动唤醒
                            queue.put(myTask);
                            lock.wait(myTask.time-curTime);
                        }
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }

                }
            }
        });
        t.start();
    }
}

你可能感兴趣的:(java,jvm,开发语言)