- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
细数那些使用过的定时器
何为定时器,说白了就是指定一个延迟时间,到期执行,就像我们早上定的闹铃一样,每天定点提示我们起床;当然在我们各个系统中也是无处不在,比如定时备份数据,定时拉取文件,定时刷新数据等等;定时器工具也是层出不穷比如Timer,ScheduledExecutorService,Spring Scheduler,HashedWheelTimer(时间轮),Quartz,Xxl-job/Elastic-job等;本文将对这些定时器工具做个简约引见和对比,都在哪些场景下使用。
Timer
Timer可以说是JDK供应最早的一个定时器了,使用简约,功能也相对来说比较简约;可以指定固定时间后触发,固定时间点触发,固定频率触发;
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(System.currentTimeMillis() + === task1);
}
}, 1000, 1000);
时间默认为毫秒,表示延迟一秒后执行任务,并且频率为1秒执行任务;Timer内部使用TaskQueue存放任务,使用TimerThread单线程用来执行任务:
private final TaskQueue queue = new TaskQueue();
private final TimerThread thread = new TimerThread(queue);
TimerThread内部是一个while(true)循环,不停的从TaskQueue中猎取任务执行;当然每次添加到TaskQueue中的任务会进行排序,通过nextExecutionTime来进行排序,这样TimerThread每次都可以猎取到最近执行的任务;Timer有两大缺点:
TimerTask中消灭未捕获的特别,影响Timer;
由于是单线程执行某个任务执行时间过长会影响其他认为的精确度;
正由于Timer存在的一些缺点,JDK1.5消灭了新的定时器ScheduledExecutorService;
ScheduledExecutorService
JDK1.5供应了线程池的功能,ScheduledExecutorService是一个接口类,具体实现类是ScheduledThreadPoolExecutor承继于ThreadPoolExecutor;
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread() + === + System.currentTimeMillis() + === task1);
}
}, 1000, 1000, TimeUnit.MILLISECONDS);
比起Timer可以配置多个线程去执行定时任务,同时特别任务并不会中缀ScheduledExecutorService,线程池的几个核心配置:
corePoolSize:核心线程数量,假如线程池中的线程少于此数目,则在执行任务时创建,核心线程不会被回收;
maximumPoolSize:允许的最大线程数,当线程数量达到corePoolSize且workQueue队列满了,会创建线程;
keepAliveTime:超过corePoolSize空闲时间;
unit:keepAliveTime的单位;
workQueue:当线程超过corePoolSize,新的任务会被加入到队列中等待;
threadFactory:创建线程的工厂类;
handler:线程池拒绝策略,包括:AbortPolicy,DiscardPolicy,DiscardOldestPolicy,CallerRunsPolicy策略,当然也可以本人扩展;
ScheduledExecutorService中添加的任务会被包装成一个ScheduledFutureTask类,同时将任务放入DelayedWorkQueue队列中是一个BlockingQueue;类似Timer也会依据加入任务触发时间的先后进行排序,然后线程池中的Worker会到Queue中猎取任务执行;
Spring Sc
您可能关注的文档
最近下载
- 《低钠血症的中国专家共识(2023)》解读PPT课件.pptx VIP
- 初中语文通用版 现代文阅读答题技巧(公式化模板 + 完整版提分攻略).docx VIP
- 期刊合作办刊协议书.docx VIP
- 驭胜s350维修手册及电路图n351整车电路图全.pdf VIP
- 混凝土热工计算软件.xls VIP
- 小学信息技术教学计划.docx VIP
- 八 观察物体(二)(单元教学设计)苏教版 三年级上册数学2025版.pdf
- 七上语文常考必背重点知识梳理总结(答案版)【2024新版】.pdf VIP
- 最全面总工会招聘考试工会知识模拟试卷及答案(共五套).docx
- 2020年总工会招聘考试工会知识模拟试卷及答案(一).docx VIP
原创力文档


文档评论(0)