Java – thread.sleep的替代品

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

这是算法,我不希望在expectElapsedTime经过之前返回检查条件。

 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; } 

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

你能指望什么?

如果你进入睡眠状态,那么一旦你的进程再次运行,就必须等待线程调度程序再次安排它。

我的意思是如果你进入睡眠50秒并不意味着你的过程将在50秒内运行。因为它醒来并且可以运行它将不得不等待安排到CPU,这需要额外的时间加上你的时间有上下文切换。

没有什么可以控制它,所以你不能有你说的准确性。

对于你的情况,我会建议一个旋转循环。

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

Java不是一个实时系统,你不能让一个线程消失,并回到如此紧张的时间表。 要将程序执行时间缩短到毫秒,您需要使用不同的平台 – 例如simpleRTJ或Java Real-Time扩展 。

延迟可能是任意选择的,所以我会质疑你需要实时间隔时间。

如果您需要阅读时间,您需要忙着等待时间到达。 放弃CPU意味着您无法保证在需要时将其准确地取回。

您可以实现等待/通知机制并委托给另一个线程负责通知处于等待状态的其他线程已经过了一段时间并且它可以继续……

例如,当threadA需要等待一段时间时,您可以将线程置于等待状态并启动一个计时器任务,在一定时间(间隔)之后调用notify并唤醒前进的ThreadA,这可能是另一种选择。

如果你想要使用声音准确,你可以使用音序器并在BPM中设置速度:sequencer.setTempoInBPM(120);

解决方案是使用具有runnable的处理程序并使用方法’postDelayed’。 例:

 new Handler().postDelayed(new Runnable() { public void run () { // Do delayed stuff! } }, 5000L); //5 seconds delay 

https://stackoverflow.com/a/21680858

不要忘记垃圾收集器暂停。 它可以击败你的所有计划