Java - thread.sleep 的替代

2022-09-01 20:50:47

我需要暂停一个 while 循环特定的毫秒数。我尝试过使用Thread.sleep(持续时间),但它不准确,特别是在循环场景中。毫秒级精度在我的程序中很重要。

这是一个算法,我不想回去检查条件,直到过去。expectedElapsedTime

while (condition) {
    time = System.currentTimeMillis();
    //do something
    if (elapsedTime(time) < expectedElapsedTime) ) {
        pause the loop  // NEED SUBSTITUTE FOR Thread.sleep()
    }
    // Alternative that I have tried but not giving good results is 
    while ((elapsedTime(time) < expectedElapsedTime)) {
        //do nothing
    }
}

long elapsedTime(long time) {
   long diff = System.currentTimeMillis() - time;
   return diff;
}

答案 1

尝试使用 ScheduledThreadPoolExecutor。它应该提供更可靠的计时结果。


答案 2

你期待什么?

如果您进入睡眠状态,那么一旦您的进程再次可运行,它将不得不等待线程调度程序再次调度它。

我的意思是,如果您进入睡眠状态50秒,这并不意味着您的进程将在50秒内运行。因为它会唤醒并且可以运行,所以它将不得不等待调度到CPU,这需要额外的时间加上上下文切换的时间。

你无法控制它,所以你不能有你说的准确性。

对于您的情况,我建议使用旋转循环。

long now = System.currentTimeMillis();   
while(now < expectedElapsedTime){
    now = System.currentTimeMillis();
}