什么可以解释持续时间Object.wait(timeout)
超过提供的超时值?
long start = System.currentTimeMillis(); obj.wait(1000); long duration = System.currentTimeMillis() - start; // sometimes (very rarely) duration may exceed 1500
上下文:在一个非常复杂的软件深处的某个地方,有一段代码可以wait
生成这样的代码并在持续时间过长的情况下生成警告日志.在流量高的生产环境中,一些日志会报告巨大的等待(例如30秒).所以我试图重现它,了解可能发生的事情以及如何修复/改进它.
当一个线程在超时或睡眠醒来后实际唤醒时并不准确.睡眠的文件有这个说明
导致当前正在执行的线程休眠(暂时停止执行)指定的毫秒数,具体取决于系统计时器和调度程序的精度和准确性.该线程不会失去任何监视器的所有权.
通知也受这些差异的影响.
因此,它与系统中定时器的精度以及线程有资格再次运行的确切时间内正在执行的其他线程或进程有关.一般规则是超时,因为这是将经过的最小时间量.Object.notify有一个纳秒的变体,可以让你在经过的时间内获得更精细的颗粒控制.
看到的Javadoc描述 有关public final void wait(long timeout, int nanos)