什么是Timer
Timer是java.util工具包中提供的定时任务类。简洁易上手的使用方式,能帮我们快速构建一个定时任务。
如何使用Timer
使用Timer配置与执行定时任务,由两个部分组成
1.调度者Timer类
2.任务内容类TimerTask类(该类实现了Runnable接口,TimerTask是一个虚类)
使用步骤
1.创建一个Timer对象
2.创建一个Task类,需要继承TimerTask类,并且实现Runnable的run方法,用于定义具体的定时任务执行内容
3.调用Timer对象的schedule方法,并且将步骤的Task对象传入,同时传入需要延迟执行的时间,和定时任务执行的间隔时间。
从源码分析Java定时任务工具类Timer
实现原理
Timer类原理
Timer类是一个调度者的角色。它包含了两个最重要的部分:1.任务队列TaskQueue2.调度线程TimerThread。
调度线程TimerThread
当初始化一个Timer对象的时候,就会执行TimerThread线程对象。该线程会进入一个自旋,不断查询任务队列TaskQueue,如果队列为空,在线程等待。否则会获取执行时间,并且与当前时间比较,如果未到执行时间则等待差值。并且如果是重复执行的任务,会再次丢入任务队列TaskQueue。
任务队列TaskQueue
TaskQueue是一个小顶堆的数据结构,用于存储TimerTask。因此可以保证每次从队列中获取的任务都是最近要执行的任务。
当Timer对象调用schedule方法时,会将TimerTask丢入任务队列,并且唤醒调度者线程
Timer类的缺点
1.imer是单线程的,如果一次执行多个定时任务,会导致某些任务被其他任务所阻塞。比如A任务每秒执行一次,B任务10秒执行一次,但是一次执行5秒,就会导致A任务在长达5秒都不会得到执行机会。
2.Timer的执行周期时间依赖于系统时间,timer中,获取到堆顶任务执行时间后,如果执行时间还没到,会计算出需要休眠的时间=(执行时间-系统时间),如果系统时间被调整,就会导致休眠时间无限拉长,后面就算改回来了任务也因为在休眠中而得不到执行的机会。
以上就是长沙中公优就业java培训机构的小编针对“Java编程入门,定时任务timer循环”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。