我需要暂停一个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;
}
答案 0 :(得分:10)
尝试ScheduledThreadPoolExecutor。它应该给出更可靠的计时结果。
答案 1 :(得分:8)
你期待什么?
如果你进入睡眠状态,那么一旦你的进程再次运行,就必须等待线程调度程序再次安排它。
我的意思是如果你进入睡眠状态50秒并不意味着你的进程将在50秒内运行。因为它唤醒并且可以运行它将不得不等待安排到CPU,这需要额外的时间加上上下文切换的时间。
你无法控制它,因此你无法掌握所说的准确性。
对于你的情况,我会建议一个旋转循环。
long now = System.currentTimeMillis();
while(now < expectedElapsedTime){
now = System.currentTimeMillis();
}
答案 2 :(得分:6)
Java不是一个实时系统,你不能让一个线程消失并回到如此紧张的时间表上。要将程序执行时间缩短至毫秒,您需要使用其他平台 - 例如simpleRTJ或Java Real-Time extension。
答案 3 :(得分:2)
延迟可能是任意选择的,所以我会质疑你需要实时间隔时间。
如果您需要阅读时间,您需要忙着等待时间到达。放弃CPU意味着你不能保证你会在你想要的时候准确地取回它。
答案 4 :(得分:1)
您可以实现等待/通知机制并委托给另一个线程负责通知处于等待状态的其他线程通过时间量并且可以继续......
例如,当threadA需要等待一段时间时,您可以将线程置于等待状态并启动一个计时器任务,在一定时间(间隔)之后调用notify并唤醒前进的ThreadA ,这可能是另一种选择。
答案 5 :(得分:1)
如果您想要使用声音准确,可以使用音序器并在BPM中设置速度: sequencer.setTempoInBPM(120);
答案 6 :(得分:1)
解决方案是使用带有runnable的处理程序并使用'postDelayed'方法。例如:
new Handler().postDelayed(new Runnable() {
public void run () {
// Do delayed stuff!
}
}, 5000L); //5 seconds delay
答案 7 :(得分:0)
不要忘记垃圾收集器暂停。它可以击败你的所有计划