我需要将while循环暂停特定的毫秒数。我尝试使用Thread.sleep(duration),但是它不准确,尤其是在循环场景中。毫秒精度在我的程序中很重要。
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; }
你能指望什么?
如果您进入睡眠状态,则一旦您的进程再次可运行,就必须等待线程调度程序再次对其进行调度。
我的意思是如果您进入睡眠状态50秒钟,这并不意味着您的进程将在完全50秒钟内运行,因为它一旦唤醒并可以运行,则必须等待安排到CPU,这需要额外的时间加上您的时间有上下文切换。
您无能为力,无法控制它,因此您无法达到所说的准确性。
对于您的情况,我建议改为旋转循环。
long now = System.currentTimeMillis(); while(now < expectedElapsedTime){ now = System.currentTimeMillis(); }
尝试使用ScheduledThreadPoolExecutor 。应该可以提供更可靠的计时结果。