实现定时器(基于标准库提供的定时器、基于优先级队列自实现的定时器)

迷南。 2024-03-30 15:33 184阅读 0赞

目录:

一、基于标准库提供的定时器
二、基于优先级队列自实现的定时器

一、基于标准库提供的定时器

  1. public static void main(String[] args) {
  2. //Timer类就是标准库提供的定时器
  3. Timer timer = new Timer();
  4. timer.schedule(new TimerTask() {
  5. @Override
  6. public void run() {
  7. System.out.println("定时器任务3");
  8. }
  9. },3000);
  10. timer.schedule(new TimerTask() {
  11. @Override
  12. public void run() {
  13. System.out.println("定时器任务2");
  14. }
  15. },2000);
  16. timer.schedule(new TimerTask() {
  17. @Override
  18. public void run() {
  19. System.out.println("定时器任务1");
  20. }
  21. },1000);
  22. }

二、基于优先级队列自实现的定时器

  1. //这个类表示一个定时器中的任务
  2. class MyTask implements Comparable<MyTask>{
  3. //要执行的任务
  4. private Runnable runnable;
  5. //该任务在什么时候后执行
  6. private Long time;
  7. //提供有参构造方法
  8. public MyTask(Runnable runnable, Long time) {
  9. this.runnable = runnable;
  10. this.time = time;
  11. }
  12. //提供time的Get方法
  13. public Long getTime() {
  14. return time;
  15. }
  16. //执行任务
  17. public void run(){
  18. runnable.run();
  19. }
  20. @Override
  21. public int compareTo(MyTask o) {
  22. return (int) (this.time - o.time);
  23. }
  24. }
  25. //自实现的定时器
  26. class MyTimer{
  27. //专门一个线程来扫描是否已经到时间了
  28. private Thread t = null;
  29. //专门一个阻塞优先级队列来保存任务
  30. private PriorityBlockingQueue<MyTask> queue = new PriorityBlockingQueue<>();
  31. public MyTimer(){
  32. t = new Thread(()->{
  33. while (true){
  34. synchronized (this){
  35. try {
  36. MyTask myTask = queue.take();
  37. long curTime = System.currentTimeMillis();
  38. if (curTime < myTask.getTime()){
  39. //还没到时间,继续放回队列,这里再算一下需要等待的时间,避免忙等
  40. queue.put(myTask);
  41. this.wait(myTask.getTime() - curTime);
  42. }else {
  43. //时间到了
  44. myTask.run();
  45. }
  46. } catch (InterruptedException e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. }
  51. });
  52. t.start();
  53. }
  54. // 第一个参数是 任务 内容
  55. // 第二个参数是 任务 在多少毫秒之后执行
  56. // 把任务加入队列
  57. public void schedule(Runnable runnable,Long after){
  58. MyTask myTask = new MyTask(runnable,System.currentTimeMillis()+after);
  59. queue.put(myTask);
  60. //这里是每次新加入一个任务,都要去唤醒,再次重新计算需要等待的时间
  61. synchronized (this){
  62. this.notify();
  63. }
  64. }
  65. }
  66. public class ThreadDemo24 {
  67. public static void main(String[] args) {
  68. MyTimer myTimer = new MyTimer();
  69. myTimer.schedule(new Runnable() {
  70. @Override
  71. public void run() {
  72. System.out.println("定时器任务3");
  73. }
  74. },3000L);
  75. myTimer.schedule(new TimerTask() {
  76. @Override
  77. public void run() {
  78. System.out.println("定时器任务2");
  79. }
  80. },2000L);
  81. myTimer.schedule(new TimerTask() {
  82. @Override
  83. public void run() {
  84. System.out.println("定时器任务1");
  85. }
  86. },1000L);
  87. }
  88. }

发表评论

表情:
评论列表 (有 0 条评论,184人围观)

还没有评论,来说两句吧...

相关阅读