本文共 477 字,大约阅读时间需要 1 分钟。
问题现象:使用ScheduleExecutorService部署定时任务,在时间向过去跳变比如当前11点跳变为10点后,定时任务突然失效,然后再次到11点时所有积压的定时任务(10-11点)一起执行,可能导致业务压力过大 问题原因:POSIX提供的标准计时器API进行封装,主要提供了两种类型的时钟的封装:CLOCK_REALTIME和CLOCK_MONOTONIC,第一种绝对时间,第二种是相对时间,JDK1.6中使用的是第一种,jdk内部的修复方式是改为第二种(见bug最下面评论) 为什么会存在定时任务积压呢?内部实现原理应该和Timer类实现比较类似,即内部有一个队列,以11点跳变到10点为例,假设有个10分钟执行一次的定时任务,本来马上要执行11:10分的定时任务,但是跳变了,然后10:10分的任务进入队列,然后每次队首时间和当前时间比较,如果<=当前时间,则出队列,所以再次到11点10分的时候,之前的任务都出队列然后依次执行了.问题解决:升级业务JDK1.6为JDK1.8
此外,比较神奇的是在SUSE10的业务主机上并没有这个问题;
转载地址:http://glcqb.baihongyu.com/