🙉专栏推荐:Java入门知识🙉
🙉 内容推荐:🙉
🐹今日诗词:《今朝有酒今朝醉, 明日愁来明日忧》🐹
⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏
⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏
目录
Timer定时器的使用
我们先认识一下定时器需要用到的类以及各种方法吧!
定时器大致有三种使用方式,我们一起看看吧!
了解了定时器的工作流程我们来试着手撕一个定时器吧,让你的女神刮目相看
模拟Timer定时器功能
思路
Timer中的schedule方法有TimerTask(任务)和time(时间)两个参数
定时器中相对时间短的任务要先执行,因此我任务我们采用优先级队列实现,
时间用long类型(Timer中是long)
任务内容我们用runnable接口是实现
这样大致的框架就搭好了,并且给上构造方法
比较器的实现
实现Compareable接口,重写compareTo方法即可
比较相对时间大小后,将任务执行入队操作
扫描线程
任务已经创建好了,对应时间执行对应任务 ,就需要时间检测了
扫描线程要进行时间检测,因此创建对象的时候就应该有扫描线程了
因此我们选择把扫描线程添加到MyTimer构造方法中,创建Timer的时候自动创建扫描线程了
扫描线程要一直检测,加个死循环就得到了大致框架了
while循环内部就是检测到时间到没到,我们来完善一下细节吧
至此这样一个<<简简单单>>的定时器就<大致>完成了
但是目前还是有两个很大的问题
1. 线程安全
2. 线程饿死
问题一
由于队列有增加和删除元素的操作,可能会引发线程安全问题
线程安全很好解决,加锁就完事了
这样就加锁完成了,但是仔细观察加锁的位置发现红框加锁把循环也放进锁里了,由于是死循环,就会导致锁一直不能释放,所以应该把锁的位置放到循环内部
正确加锁方式
问题二
由于是死循环,队列为空时或者没到执行任务的时间,while就会一直循环,疯狂加锁解锁,反复横跳,导致其他线程抢不到锁,(我又走了,我又来了)
解决方法: 可以使用wait操作让线程等待
队列为空时,等到进行入队操作后唤醒线程
没到执行任务的时间, 可以使用带有超时时间的wait方法
运行效果
下面就是见证奇迹的时候了
美图分享
✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄
⭐️点赞收藏加关注,学习知识不迷路⭐️
🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉
👍😏⛳️点赞☀️收藏⭐️关注😏👍
👍😏⛳️点赞☀️收藏⭐️关注😏👍
👍😏⛳️点赞☀️收藏⭐️关注😏👍
🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️