Timer定时器功能及模拟实现

🙉专栏推荐:Java入门知识🙉

🙉 内容推荐:🙉

🐹今日诗词:《今朝有酒今朝醉, 明日愁来明日忧》🐹


⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏

⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏


目录

Timer定时器的使用

模拟Timer定时器功能

思路

比较器的实现

扫描线程

问题一

问题二

运行效果

美图分享


Timer定时器的使用

我们先认识一下定时器需要用到的类以及各种方法吧!

定时器大致有三种使用方式,我们一起看看吧!

了解了定时器的工作流程我们来试着手撕一个定时器吧,让你的女神刮目相看

模拟Timer定时器功能

思路

Timer中的schedule方法有TimerTask(任务)time(时间)两个参数

定时器中相对时间短的任务要先执行,因此我任务我们采用优先级队列实现,

时间用long类型(Timer中是long)

任务内容我们用runnable接口是实现

这样大致的框架就搭好了,并且给上构造方法

比较器的实现

实现Compareable接口,重写compareTo方法即可

比较相对时间大小后,将任务执行入队操作

扫描线程

任务已经创建好了,对应时间执行对应任务 ,就需要时间检测了

扫描线程要进行时间检测,因此创建对象的时候就应该有扫描线程

因此我们选择把扫描线程添加到MyTimer构造方法中,创建Timer的时候自动创建扫描线程了

扫描线程要一直检测,加个死循环就得到了大致框架了

while循环内部就是检测到时间到没到,我们来完善一下细节吧

至此这样一个<<简简单单>>的定时器就<大致>完成了

但是目前还是有两个很大的问题

1. 线程安全

2. 线程饿死

问题一

由于队列有增加和删除元素的操作,可能会引发线程安全问题

线程安全很好解决,加锁就完事了

这样就加锁完成了,但是仔细观察加锁的位置发现红框加锁把循环也放进锁里了,由于是死循环,就会导致锁一直不能释放,所以应该把锁的位置放到循环内部

正确加锁方式

问题二

由于是死循环,队列为空时或者没到执行任务的时间,while就会一直循环,疯狂加锁解锁,反复横跳,导致其他线程抢不到锁,(我又走了,我又来了)

解决方法: 可以使用wait操作让线程等待

队列为空时,等到进行入队操作后唤醒线程

没到执行任务的时间, 可以使用带有超时时间的wait方法

运行效果

下面就是见证奇迹的时候了

美图分享

✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄

⭐️点赞收藏加关注,学习知识不迷路⭐️

🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️

相关推荐

  1. C++编程:实现一个跨平台安全的定时器Timer模块

    2024-03-24 23:24:01       24 阅读
  2. epoll timer实现定时任务

    2024-03-24 23:24:01       46 阅读
  3. 定时器Timer、多线程下的单例模式

    2024-03-24 23:24:01       58 阅读
  4. select定时器功能,c语言实现

    2024-03-24 23:24:01       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-24 23:24:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-24 23:24:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-24 23:24:01       82 阅读
  4. Python语言-面向对象

    2024-03-24 23:24:01       91 阅读

热门阅读

  1. 【机器学习-09】特征工程

    2024-03-24 23:24:01       34 阅读
  2. js和jsp的区别

    2024-03-24 23:24:01       37 阅读
  3. 组织碳管理--常见问题解答FAQ

    2024-03-24 23:24:01       39 阅读
  4. 【LeetCode-45.跳跃游戏】

    2024-03-24 23:24:01       38 阅读
  5. react native 总结

    2024-03-24 23:24:01       42 阅读
  6. C++面向对象:智能指针讲解

    2024-03-24 23:24:01       34 阅读
  7. 普通用户无法连接到docker服务

    2024-03-24 23:24:01       32 阅读
  8. C++:可变参数实现日志系统

    2024-03-24 23:24:01       46 阅读
  9. 求一元二次方程的根---PTA实验C++

    2024-03-24 23:24:01       41 阅读
  10. C语言——数组

    2024-03-24 23:24:01       42 阅读
  11. SQL管理员高频面试问题

    2024-03-24 23:24:01       32 阅读
  12. Spring 主要模块有哪些?

    2024-03-24 23:24:01       41 阅读
  13. 【无标题】

    2024-03-24 23:24:01       41 阅读