Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用计时器和TimerTask时的Java线程执行顺序_Java_Multithreading_Timer - Fatal编程技术网

使用计时器和TimerTask时的Java线程执行顺序

使用计时器和TimerTask时的Java线程执行顺序,java,multithreading,timer,Java,Multithreading,Timer,我使用定时器作为进程中断机制。逻辑流程如下: T0:在T0创建新的计时器,并计划一个新的计时器任务以T2 1秒的任务延迟执行,任务非常简单-设置一个标志变量 T1:在主调用线程中,睡眠5秒钟 T2:在计时器线程中,任务执行 T5:睡眠结束 T6:取消计时器和任何计划任务 该代码在我的Windows和Ubuntu开发环境中运行良好。但是,当我在SLES 10构建服务器上运行相同的代码时,日志记录指示以下执行顺序: T0:创建计时器和计时器任务以在T2执行 T1:主线程休眠5秒 T5:主线程被唤醒

我使用定时器作为进程中断机制。逻辑流程如下:

T0:在T0创建新的计时器,并计划一个新的计时器任务以T2 1秒的任务延迟执行,任务非常简单-设置一个标志变量

T1:在主调用线程中,睡眠5秒钟

T2:在计时器线程中,任务执行

T5:睡眠结束

T6:取消计时器和任何计划任务

该代码在我的Windows和Ubuntu开发环境中运行良好。但是,当我在SLES 10构建服务器上运行相同的代码时,日志记录指示以下执行顺序:

T0:创建计时器和计时器任务以在T2执行

T1:主线程休眠5秒

T5:主线程被唤醒

T6:计时器取消

T7:任务执行


有人能解释一下为什么会发生这种情况吗?非常感谢。

嗯。我很惊讶你在几秒钟内看到这么大的差异,但我想你可能会看到不同的执行顺序,从机器到机器,从jvm到jvm等等。特别是,当JIT第一次编译你的代码时,例如,在我的代码中,与相同代码的后续执行相比,我倾向于以100-300ms的顺序看到延迟,所以在您的代码中,它可能更引人注目

不确定进程中断机制是什么意思。你的意思是计时器任务会中断某个线程吗

无论如何,我现在可以建议使用System.nanoTime。虽然我不认为它能解释任何事情,但在严肃的测量中不鼓励使用System.currentTimeMillis。通常建议在JAVA_选项中添加-server,以便在通过JIT优化代码时看到行为。最好多次运行代码并获取统计信息

如果我是你,我会先做这些小事情,然后使用诸如CyclicBarrier、CountdownLatch之类的同步器进行调试,并查看延迟的确切位置

SLES活动的背景噪声程度是多少?也许操作系统很忙或者什么的


任务的性质是什么?它是否与网络/IO相关

原来是时间戳问题。使用new Date.getTime而不是System.currentTimeMillis生成了预期的执行时间戳顺序


谢谢所有的好主意。

你应该考虑在任务完成后触发一个事件。这确保了执行顺序。

您使用的是什么日志记录机制?可能只是日志刷新不正确。我使用的是log4j。我正在使用System.currentTimeMillis记录每个步骤的时间戳,所以我希望记录输出的顺序不是罪魁祸首。