一尘不染

Java-替代thread.sleep

javascript

我需要将while循环暂停特定的毫秒数。我尝试使用Thread.sleep(duration),但是它不准确,尤其是在循环场景中。毫秒精度在我的程序中很重要。

这是我不希望在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;
}

阅读 642

收藏
2020-09-25

共2个答案

一尘不染

你能指望什么?

如果您进入睡眠状态,则一旦您的进程再次可运行,就必须等待线程调度程序再次对其进行调度。

我的意思是如果您进入睡眠状态50秒钟,这并不意味着您的进程将在完全50秒钟内运行,因为它一旦唤醒并可以运行,则必须等待安排到CPU,这需要额外的时间加上您的时间有上下文切换。

您无能为力,无法控制它,因此您无法达到所说的准确性。

对于您的情况,我建议改为旋转循环。

long now = System.currentTimeMillis();   
while(now < expectedElapsedTime){
    now = System.currentTimeMillis();
}
2020-09-25
一尘不染

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

2020-09-25