在TimerTask的run()方法里使用sleep()方法后出现的奇怪想象

bobokong 2005-12-05 12:45:49
有这样一个小程序
01 import java.util.*;
02 public class Test extends TimerTask {
03
04 public void run() {
05 System.out.println("run... start->" + new Timestamp(System.currentTimeMillis()));
06 try {
07 Thread.sleep(10);
08 } catch (Exception e) {
09 System.out.println(e.getMessage());
10 }
11 System.out.println("run... end ->" + new Timestamp(System.currentTimeMillis()));
12 System.out.println("");
13 }
14
15 public static void main(String[] args) {
16 try {
17 Timer t = new Timer();
18 t.schedule(new Test(), 0, 1000);
19
20 } catch (Exception e) {
21 e.printStackTrace();
22 } finally {
23
24 }
25
26 }
27 }

大致的功能就是每隔1秒执行一下run(),输出一些log,但是当我在run()方法里使用了Thread.sleep()后发现刚开始执行的一次时间间隔好像不对(间隔时间长了),而且我只sleep 10ms,但是从log看每次都sleep 16ms,log如下:
run... start->2005-12-05 11:36:17.375
run... end ->2005-12-05 11:36:17.406

run... start->2005-12-05 11:36:18.39
run... end ->2005-12-05 11:36:18.406

run... start->2005-12-05 11:36:19.39
run... end ->2005-12-05 11:36:19.406

run... start->2005-12-05 11:36:20.39
run... end ->2005-12-05 11:36:20.406

如果我把第6-10行注释了,执行间隔时间就完全正常了,log如下:
run... start->2005-12-05 11:35:41.5
run... end ->2005-12-05 11:35:41.5

run... start->2005-12-05 11:35:42.5
run... end ->2005-12-05 11:35:42.5

run... start->2005-12-05 11:35:43.5
run... end ->2005-12-05 11:35:43.5

run... start->2005-12-05 11:35:44.5
run... end ->2005-12-05 11:35:44.5

我实在不明白TimerTask的run()里面使用sleep()后出现的现象,哪位大虾知道原因?
...全文
677 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sole_eagle 2005-12-08
  • 打赏
  • 举报
回复
sleep 可以保证你用的时间多于10ms,没有说一定是这么多,如果线程多的话可能时间会更多。
bobokong 2005-12-07
  • 打赏
  • 举报
回复
bobokong 2005-12-06
  • 打赏
  • 举报
回复
再顶
xpzheng 2005-12-06
  • 打赏
  • 举报
回复
关注中。。。
学习
Mark_Chen 2005-12-06
  • 打赏
  • 举报
回复
关注中....
up!
bobokong 2005-12-05
  • 打赏
  • 举报
回复
自己顶一下
bobokong 2005-12-05
  • 打赏
  • 举报
回复
那不考虑sleep的精度,但是我用的是schedule(),从输出信息看
run... start->2005-12-05 11:36:18.39
run... end ->2005-12-05 11:36:18.406

run... start->2005-12-05 11:36:19.39
run... end ->2005-12-05 11:36:19.406
每次结束时间和下一次开始时间之间并不是1秒,而是0.984秒,而从输出信息来看这个更像是用了scheduleAtFixedRate()后的结果。

我现在做的项目里有不少需要使用TimerTask定期执行的程序,我主要想知道在TimerTask的run()方法里使用sleep会不会有什么问题,会不会破坏原来schedule定下来的间隔时间。
ChDw 2005-12-05
  • 打赏
  • 举报
回复
t.scheduleAtFixedRate(new Test(), 0, 1000);可以保证两次开始时间保持指定的间隔
schedule是保证这一次结束到下一次开始的间隔




另外Sleep并不是精确控制的,与操作系统有关
kingfish 2005-12-05
  • 打赏
  • 举报
回复
sleep()精度问题

NT内核的系统时钟中断大概就16ms
内容概要:本文围绕“多主体综合能源系统+分布式ADMM研究”展开,系统阐述了交替方向乘子法(ADMM)在多主体综合能源系统中的分布式优化应用,提供了完整的Matlab代码实现。研究聚焦于多利益主体之间的协同优化问题,通过建立合理的数学模型,采用ADMM算法实现去中心化的求解架构,有效保障各主体的数据隐私性与决策自主性,同时提升整体系统的计算效率与优化性能。内容涵盖系统建模、优化问题分解、ADMM迭代求解流程、收敛性验证及结果分析,具有较强的理论深度与工程实践价值,适用于能源互联网、微电网群、园区综合能源系统等复杂场景的能量管理与协调调度。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、高校科研人员,以及从事综合能源系统规划、微电网优化、分布式能源管理等方向的工程技术人员。; 使用场景及目标:①应用于多主体参与的综合能源系统能量管理与协同优化调度;②帮助读者深入理解ADMM算法的分解-协调机制及其在分布式优化中的具体实现,支撑高水平学术论文复现、科研课题攻关或实际工程项目开发;③推动智能电网与能源互联网中去中心化、隐私保护型优化调度技术的发展与落地; 阅读建议:建议读者结合文中提供的Matlab代码进行动手实践,逐行调试并可视化关键变量的迭代过程,深入掌握ADMM算法的参数设置、收敛判据及数值稳定性处理技巧,并尝试将其拓展至电动汽车集群调度、多微电网互动、可再生能源消纳等其他分布式优化应用场景中进行仿真验证。

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧