我有一个java程序,其中包含一个必要的无限循环。显然,只要保持循环的原样,程序就会使用调度器给它的最大时间,所以我想在没有更多的时间计算的情况下生成当前时间片。
我已经试过了 Thread.yield()
, Thread.onSpinWait()
(虽然我不确定这是否真的像我想的那样),以及 Thread.sleep(0)
. 所有这些要么99%的时候被忽略,要么就是不起作用。
有一件事似乎是可行的 Thread.sleep(x)
,使我的cpu使用率从~100%降至~2%。然而,睡一段时间对我来说是个坏主意。我正在写一个合成器,所以需要我的时间片尽快回补音频缓冲区。
我不能简单地增加音频缓冲区的大小,因为这样做会很快引入非常明显的延迟。
音频缓冲区已经达到每20个左右的“写周期”就有80%是空的,我担心添加睡眠可能需要太大的音频缓冲区来避免较弱系统上的伪影。
有没有什么方法可以持续地给出我当前的时间片?
1条答案
按热度按时间bis0qfac1#
你可以利用
wait
¬ify
控制并发。当线程共享一个公共资源来交换数据时,调用
wait
在所述对象上,将挂起您的使用者线程,直到生产者通知它,因此避免了繁忙的旋转。阅读材料:
在java中使用wait()和notify()的简单场景
如何在没有illegalmonitorstateexception的情况下在java中使用wait和notify?