【开发过程问题汇总系列】【定时器】Timer运行的过程中把系统时间修改为以前的时间会停止运行的问题
2014-09-10 20:17
513 查看
最近项目中有一个负责的需求,需要使用定时器在tomcat启动后每隔1小时自动运行一次检查任务,问题的发现很偶然。
修改系统当前时间为未来的时间时,定时器不会出现问题,会一直运行,而把当前时间修改为过去的时间定时器会卡着不执行。
经过分析Timer定时器源码才知,时间往后调定时器一定不会执行的。
JDK1.6源码如下:
目前来看,只能采用起一个Thread在run方法中定义个死循环每隔一小时Thread.sleep(1L * 60 * 60 * 1000)来避免修改时间的问题。
修改系统当前时间为未来的时间时,定时器不会出现问题,会一直运行,而把当前时间修改为过去的时间定时器会卡着不执行。
经过分析Timer定时器源码才知,时间往后调定时器一定不会执行的。
JDK1.6源码如下:
/** * The main timer loop. (See class comment.) */ private void mainLoop() { while (true) { try { TimerTask task; boolean taskFired; synchronized(queue) { // Wait for queue to become non-empty while (queue.isEmpty() && newTasksMayBeScheduled) queue.wait(); if (queue.isEmpty()) break; // Queue is empty and will forever remain; die // Queue nonempty; look at first evt and do the right thing long currentTime, executionTime; task = queue.getMin(); synchronized(task.lock) { if (task.state == TimerTask.CANCELLED) { queue.removeMin(); continue; // No action required, poll queue again } currentTime = System.currentTimeMillis(); executionTime = task.nextExecutionTime; if (taskFired = (executionTime<=currentTime)) { if (task.period == 0) { // Non-repeating, remove queue.removeMin(); task.state = TimerTask.EXECUTED; } else { // Repeating task, reschedule queue.rescheduleMin( task.period<0 ? currentTime - task.period : executionTime + task.period); } } } if (!taskFired) // Task hasn't yet fired; wait queue.wait(executionTime - currentTime); } if (taskFired) // Task fired; run it, holding no locks task.run(); } catch(InterruptedException e) { } } }
目前来看,只能采用起一个Thread在run方法中定义个死循环每隔一小时Thread.sleep(1L * 60 * 60 * 1000)来避免修改时间的问题。
相关文章推荐
- 【开发过程问题汇总系列】【ExtJS 界面开发问题】新增和修改界面控件的id命名一样导致界面显示错乱的问题
- ELK学习10_ELK系列--实时日志分析系统ELK 部署与运行中的问题汇总
- 【开发过程问题汇总系列】【B/S struts2】加好jar包且配置好struts.xml后action还是无法请求的问题
- 【开发过程问题汇总系列】【iframe自适应高度】兼容 FireFox和IE内核的浏览器
- 【开发过程问题汇总系列】【JS控制 iframe跳转】兼容 FireFox和IE内核的浏览器
- 最近这段时间开发过程中遇到的一些细节问题汇总
- volcanol_Linux_问题汇总系列_1_系统引导过程中到check filesystem时就无法继续引导问题解决方法。
- jstack直接dump出jvm的thread statck解决系统运行过程中停止响应的问题
- ELK学习10_ELK系列--实时日志分析系统ELK 部署与运行中的问题汇总
- C#中WebService 的 Timer定时器过段时间后自动停止运行
- ELK系列--实时日志分析系统ELK 部署与运行中的问题汇总
- Eclipse Rcp系列 5 开发过程中遇到的小问题合集
- 开发时间过程中遇到的一些问题
- 用myeclipse开发的时候 不能发布最新修改的代码 缓存 系统时间修改了
- android系统开发小问题-启动过程中android字符没有显示出来
- Oracle DB 服务器 系统时间修改问题 与 SCN 关系的深入研究
- Oracle DB 服务器 系统时间修改问题 与 SCN 关系的深入研究
- 某店铺收银系统开发过程中出现的几点问题
- 手动测试存储过程运行正常,job执行存储过程会长时间的处于运行状态,不手动停止,会一直运行不过去!
- 重装了JBUILDER,以前能运行的系统又不行了的问题及解决