当前位置:网站首页 > Java基础 > 正文

timer定时器教程java



文章目录

  • 1. 前言
  • 2. 定时器的基本使用
  • 3. 实现定时器
  • 4. 优化上述的定时器代码
  • 5. 总结

在Java中,定时器类是用于执行定时任务的工具类。它允许你安排一个任务在未来的某个时间点执行,或者以固定的时间间隔重复执行。

Java的标准库库中就给我们提供了一个

可以看到这个类在很多包里面都有,注意要选择里的

形参:

  • :要执行的任务,必须是的子类,可以通过继承类并重写方法来定义具体的任务逻辑。
  • :指定任务执行的时间,类型为。

当然一个Timer类中也可以执行设置多个任务.

示例:

 
  

运行结果:


仔细观察运行结果,会发现这个程序有些问题,为什么程序执行完了,进程没有退出呢?

是因为Timer内部需要一组线程来执行注册任务,这里的线程是前台线程,会影响进程的退出

实现定时器,最主要的就是实现里面的方法

 
  

是Java中的一个静态方法,用于获取当前时间的毫秒数。

描述一个任务,以及多久后执行定时器的第一步完成了

接下来就是如何让这个定时器能够管理多个任务,例如上述示例中输出1s,2s,3s的那个示例一样

关于如何管理这些任务,我们肯定是想让设置时间短的任务先执行,但是在设置任务时,不一定会按照时间从小到大的顺序去进行放入. 这时候就要使用到

将任务添加到阻塞队列中即可.

但是优先级队列的对象的类型必须是可比较的. 我们可以让实现接口,实现里面的方法. 比较的规则就是时间,时间小的优先级高.

接下来就要检查队首任务的时间是否到了,时间到了就要执行任务. 可以单独创建一个扫描线程来进行检查.

完整代码:

 
  

测试代码:

 
  

"忙等"是指一个线程在等待某个条件满足时,不断地进行无效的循环检查,而不释放CPU资源给其他线程执行。这种方式会浪费CPU资源,并且可能导致性能下降。

针对这个问题,我们可以使用 来解决这个问题

通过使用和,对这个类进行优化:

 
  

虽然解决了"忙等"问题,但是又带来了新的问题.

如果扫描线程再取出队首任务(10分钟后要执行)时,线程切换,执行方法,新增任务(5分钟后执行)然后执行,但此时并没有通知线程并没有意义,因为扫描线程刚执行完take,并没有执行到,然后扫描线程继续执行,进行,等待10分钟. 这样就会把刚才新增的5分钟后执行的任务给错过了.

对于上述问题 产生的原因还是因为"锁"的粒度不够大, 这些操作不是原子的,只需放大锁的粒度即可

 
  


上述为了解决"忙等"问题,使用wait和notify进行优化,而在优化过程因为加锁的范围不一样,又带来了新的问题. 因此多线程问题很复杂,加锁的范围,线程的切换都会影响程序的执行效果.

  • 上一篇: java kotlin教程
  • 下一篇: 企业java教程
  • 版权声明


    相关文章:

  • java kotlin教程2025-10-14 19:50:01
  • 廖海峰java教程2025-10-14 19:50:01
  • java离线联机教程2025-10-14 19:50:01
  • java lambda 教程2025-10-14 19:50:01
  • java大学教程 脚本之家2025-10-14 19:50:01
  • 企业java教程2025-10-14 19:50:01
  • java web bbs制作教程2025-10-14 19:50:01
  • java教程初级版2025-10-14 19:50:01
  • java拉勾视频教程2025-10-14 19:50:01
  • java移位教程2025-10-14 19:50:01