• Java定时器


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

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

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

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

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

    1. import java.util.Timer;
    2. import java.util.TimerTask;
    3. public class Main {
    4. public static void main(String[] args) {
    5. Timer timer =new Timer();//创建实列
    6. timer.schedule(new TimerTask() {
    7. @Override
    8. public void run() {
    9. System.out.println("hello4");
    10. }
    11. },4000);//4000毫秒后执行
    12. timer.schedule(new TimerTask() {
    13. @Override
    14. public void run() {
    15. System.out.println("hello3");
    16. }
    17. },3000);//3000毫秒后执行
    18. timer.schedule(new TimerTask() {
    19. @Override
    20. public void run() {
    21. System.out.println("hello2"
    22. );
    23. }
    24. },3000);//2000毫秒后执行
    25. timer.schedule(new TimerTask() {
    26. @Override
    27. public void run() {
    28. System.out.println("hello1");
    29. }
    30. },3000);//1000毫秒后执行
    31. System.out.println("hello ");
    32. }
    33. }

    上述代码的运行结果为:

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

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

    超时是504

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

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

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

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

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

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

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

    • 执行的任务是啥??
    • 任务啥时候结束??
    1. //描述任务的类
    2. class MyTask implements Comparable{
    3. private Runnable runnable;//描述要执行的任务
    4. private long time;//什么时间执行,用时间戳来表示
    5. public MyTask(Runnable task,long delay){
    6. this.runnable = task;
    7. this.time = System.currentTimeMillis() + delay;
    8. }
    9. public Runnable getRunnable() {
    10. return runnable;
    11. }
    12. public long getTime() {
    13. return time;
    14. }
    15. @Override
    16. public int compareTo(MyTask o) {
    17. return (int) (this.getTime()-o.getTime());
    18. }
    19. }
    20. //定时器
    21. public class MyTimer {
    22. private BlockingQueue queue = new PriorityBlockingQueue<>();
    23. Object locker = new Object();
    24. public MyTimer(){
    25. Thread t = new Thread(() -> {
    26. while (true){
    27. synchronized (locker) {
    28. try {
    29. MyTask task = queue.take();//获取队首元素
    30. long curTime = System.currentTimeMillis();//获取当前时间
    31. //比较当前时间和队首元素的执行时间
    32. if(curTime >= task.getTime()){
    33. //时间到,执行任务
    34. task.getRunnable().run();
    35. }else {
    36. //时间没到,把元素再放回到队列中
    37. queue.put(task);
    38. locker.wait(task.getTime() - curTime);
    39. }
    40. } catch (InterruptedException e) {
    41. e.printStackTrace();
    42. }
    43. }
    44. }
    45. });
    46. t.start();
    47. }
    48. public void schedule(Runnable task,long delay) throws InterruptedException {
    49. MyTask myTask = new MyTask(task, delay);
    50. //把任务放入队列中
    51. queue.put(myTask);
    52. synchronized (locker){
    53. locker.notify();
    54. }
    55. }
    56. }

    可参考:

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

  • 相关阅读:
    【数值模型系列】WPS概述
    k8s-dynamic-pvc
    leetcode114 二叉树展开为链表
    Django系列17-员工管理系统实战--文件上传
    数据结构之顺序表
    Pytest自动化测试框架---(单元测试框架)
    String的intern()方法详解
    还能这样操作?勒索软件团伙向监管部门举报受害者!
    python如何将c代码打包,上传
    shell脚本--------函数
  • 原文地址:https://blog.csdn.net/weixin_64308540/article/details/132841823