Java定时器

简介: Java定时器

对于定时器的设定,想必大家在不少网站或者文章中见到吧,但是所谓的定时器如何去用Java代码来bian'x呢??感兴趣的老铁,可以看一下笔者这篇文章哟~~

所谓的定时器就是闹钟!!

设定一个时间,当时间到,就可以执行一个指定的代码~

标准库提供的定时器Timer《——》在java.util包底下

Timer里内置了线程(前台线程),会阻止线程结束(代码运行后可见)

import java.util.Timer;
import java.util.TimerTask;
public class Main {
    public static void main(String[] args) {
        Timer timer =new Timer();//创建实列
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello4");
            }
        },4000);//4000毫秒后执行
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello3");
            }
        },3000);//3000毫秒后执行
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello2"
                );
            }
        },3000);//2000毫秒后执行
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello1");
            }
        },3000);//1000毫秒后执行
        System.out.println("hello ");
    }
}

上述代码的运行结果为:

在上述用到的:schedule:安排,安排一个工作,但不是立即完成,而是在未来某个时间点执行~

定时器应用场景非常多!尤其是网络编程~

超时是504

那么,如何自己实现一个定时器呢??

定时器内部关联的不仅仅是一个任务,可以管理很多任务的!!(比如:上面的代码),虽然任务可能有很多,他们的触发时间是不同的~

只要有一个/一组工作线程,每次都找到这些认为有最先到达时间的任务,当一个线程,先执行最早的任务,等做完了之后,在执行第二早的!时间到了就执行,时间没到就先等等!

定时器可能有多个线程在执行schedule方法!!希望在多线程下操作优先级队列,还能线程安全哈!!

PriorityBlockingQueue<>带有优先级的阻塞队列!

<>这里的元素需要我们手动封装一下里面的元素!

创建个类:表示两方面信息:

  • 执行的任务是啥??
  • 任务啥时候结束??
//描述任务的类
class MyTask implements Comparable<MyTask>{
    private Runnable runnable;//描述要执行的任务
    private long time;//什么时间执行,用时间戳来表示
    public MyTask(Runnable task,long delay){
        this.runnable = task;
        this.time = System.currentTimeMillis() + delay;
    }
    public Runnable getRunnable() {
        return runnable;
    }
    public long getTime() {
        return time;
    }
    @Override
    public int compareTo(MyTask o) {
        return (int) (this.getTime()-o.getTime());
    }
}
//定时器
public class MyTimer {
    private BlockingQueue<MyTask> queue = new PriorityBlockingQueue<>();
    Object locker = new Object();
    public MyTimer(){
        Thread t = new Thread(() -> {
           while (true){
               synchronized (locker) {
                   try {
                       MyTask task = queue.take();//获取队首元素
                       long curTime = System.currentTimeMillis();//获取当前时间
                       //比较当前时间和队首元素的执行时间
                       if(curTime >= task.getTime()){
                           //时间到,执行任务
                           task.getRunnable().run();
                       }else {
                           //时间没到,把元素再放回到队列中
                           queue.put(task);
                           locker.wait(task.getTime() - curTime);
                       }
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
           }
        });
        t.start();
    }
    public void schedule(Runnable task,long delay) throws InterruptedException {
        MyTask myTask = new MyTask(task, delay);
        //把任务放入队列中
        queue.put(myTask);
        synchronized (locker){
            locker.notify();
        }
    }
}

可参考:

Java定时器_吃点橘子的博客-CSDN博客

相关文章
|
3月前
|
安全 Java
Java多线程基础-10:代码案例之定时器(一)
`Timer` 是 Java 中的一个定时器类,用于在指定延迟后执行指定的任务。它常用于实现定时任务,例如在网络通信中设置超时或定期清理数据。`Timer` 的核心方法是 `schedule()`,它可以安排任务在延迟一段时间后执行。`
75 1
|
1月前
|
Java 调度 开发者
Java定时器的使用方法与调度策略
Java定时器的使用方法与调度策略
|
3月前
|
设计模式 安全 Java
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
|
3月前
|
Java 调度
Java多线程基础-10:代码案例之定时器(二)
Java 多线程基础中,定时器(Timer)的实现通常使用 `PriorityBlockingQueue` 和 `wait/notify` 机制来管理任务。
26 0
|
9月前
|
Java
java的Timer定时器
java的Timer定时器
|
3月前
|
安全 Java 容器
Java定时器
Java定时器
35 0
|
3月前
|
Java
【Java多线程】定时器Timer
【Java多线程】定时器Timer
42 0
【Java多线程】定时器Timer
《Java-SE-第二十五章》之定时器
《Java-SE-第二十五章》之定时器
|
安全 Java
【Java|多线程与高并发】定时器(Timer)详解
在Java中,定时器Timer类是用于执行定时任务的工具类。它允许你安排一个任务在未来的某个时间点执行,或者以固定的时间间隔重复执行。
|
Java 调度
Java多线程(三)——线程池及定时器
Java多线程(三)——线程池及定时器
294 0