所以我有这个简单的线程,它以每秒的新时差更新我的TextBox。
try {
Thread.sleep(1000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
editTextBox.setText(""+timeDifference);
但是我希望TextBox更新更快,但保持相同的值。所以我的想法是将睡眠值减少到现在的一半(250),并保持输出不变,我也会将输出减少1/4,结果是:
try {
Thread.sleep(250);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
editTextBox.setText(""+timeDifference/4);
但是,第二个示例的输出落后大约10%。为什么是这样?我的进程的计算是否需要花费超过250ms的时间,这就是为什么要落后呢?
提前致谢
最佳答案
Thread.sleep(250)
并不意味着您的线程将在250 ms之后再次开始执行。
当您休眠线程时,其状态将传递到idle
。当sleep
结束时,它传递到active
,这意味着可以执行,但是调度程序可能正在忙于执行另一个线程(甚至在此之前选择其他线程来执行)。
再加上重新执行线程(环境更改)和可能的计时错误所需的时间,您将有延迟。大多数变化虽然不是恒定的,但与睡眠时间无关,因此,当睡眠时间小时,差异较大。
最后,请记住,Java
不是实时系统,因此您不能指望时间遵循严格的“时间表”(因为缺少更好的单词)。