专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java编程入门,定时任务timer循环

Java编程入门,定时任务timer循环

更新时间:2020-05-18 15:23:42 来源:动力节点 浏览3190次

什么是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

Java编程入门,定时任务timer循环

实现原理

Timer类原理

Timer类是一个调度者的角色。它包含了两个最重要的部分:1.任务队列TaskQueue2.调度线程TimerThread。

调度线程TimerThread

当初始化一个Timer对象的时候,就会执行TimerThread线程对象。该线程会进入一个自旋,不断查询任务队列TaskQueue,如果队列为空,在线程等待。否则会获取执行时间,并且与当前时间比较,如果未到执行时间则等待差值。并且如果是重复执行的任务,会再次丢入任务队列TaskQueue。

Java编程入门,定时任务timer循环

任务队列TaskQueue

TaskQueue是一个小顶堆的数据结构,用于存储TimerTask。因此可以保证每次从队列中获取的任务都是最近要执行的任务。

当Timer对象调用schedule方法时,会将TimerTask丢入任务队列,并且唤醒调度者线程

Java编程入门,定时任务timer循环  

Timer类的缺点

1.imer是单线程的,如果一次执行多个定时任务,会导致某些任务被其他任务所阻塞。比如A任务每秒执行一次,B任务10秒执行一次,但是一次执行5秒,就会导致A任务在长达5秒都不会得到执行机会。

2.Timer的执行周期时间依赖于系统时间,timer中,获取到堆顶任务执行时间后,如果执行时间还没到,会计算出需要休眠的时间=(执行时间-系统时间),如果系统时间被调整,就会导致休眠时间无限拉长,后面就算改回来了任务也因为在休眠中而得不到执行的机会。

以上就是动力节点java培训机构的小编针对“Java编程入门,定时任务timer循环”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>