工作之余就想写这篇文章了,但是种种原因没有写上,回到家中记录一下,以供在被岁月摧残的N多年之后回忆一下,也许还可以给别人带来帮助,而更多的是为了温故而知新,不善言谈,直接上代码。
class MyTask extends TimerTask {
public void run() {
System.out.print("hello everybody!");
}
}
Timer timer = new Timer();
timer.schedule(new MyTask(), 60*1000, 60*1000);
上面这段代码的意思非常简单,每隔60秒输出一次hello everybody!
那么问题来了!
1、如果在linux上面运行,调整了系统时间比当前时间多一分钟,那么这个输出不会等待60秒后输出,而是马上输出。
2、如果在window上面运行,调整了系统时间比当前时间多一分钟,这个输出还是需要等待60秒才会输出。
于是我分别查看了linux和window下的java soource,没发现出入。
然后我远程调试最终发现是因为Object.wait()方法是native实现的,调用的是dll文件,linux下的wait会受到系统时间调整的影响,而window不会,所以导致了这个问题,懒得找c++代码去看,而且猜也能猜到c++的大概写法,就到这了,有兴趣的童鞋可以把c++的代码贴出来供大家学习。
class MyTask extends TimerTask {
public void run() {
System.out.print("hello everybody!");
}
}
Timer timer = new Timer();
timer.schedule(new MyTask(), 60*1000, 60*1000);
上面这段代码的意思非常简单,每隔60秒输出一次hello everybody!
那么问题来了!
1、如果在linux上面运行,调整了系统时间比当前时间多一分钟,那么这个输出不会等待60秒后输出,而是马上输出。
2、如果在window上面运行,调整了系统时间比当前时间多一分钟,这个输出还是需要等待60秒才会输出。
于是我分别查看了linux和window下的java soource,没发现出入。
然后我远程调试最终发现是因为Object.wait()方法是native实现的,调用的是dll文件,linux下的wait会受到系统时间调整的影响,而window不会,所以导致了这个问题,懒得找c++代码去看,而且猜也能猜到c++的大概写法,就到这了,有兴趣的童鞋可以把c++的代码贴出来供大家学习。
本文深入分析了Java代码中定时任务的实现原理,特别是当系统时间调整时,Linux和Windows环境下输出延迟差异的原因。通过远程调试揭示了问题关键在于Object.wait()方法的native实现差异,Linux下受系统时间调整影响,而Windows不受此影响。文章旨在为开发者提供解决此类问题的思路。
98

被折叠的 条评论
为什么被折叠?



