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

文章介绍了Java中的Timer类如何用于实现定时任务,通过示例展示了如何创建Timer对象并调度TimerTask,在不同的延迟后打印线程编号。还提供了一个自定义的MyTimer类,使用PriorityBlockingQueue模拟了Timer的功能,按照任务的预计执行时间排序并执行。
摘要由CSDN通过智能技术生成

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的使用

 模拟实现Timer

import java.util.concurrent.PriorityBlockingQueue;

//要执行的任务的属性
class MyTask implements Comparable<MyTask> {
    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<MyTask> 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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值