我有一个包含必要的无限循环的Java程序。显然,仅按原样保留循环会导致程序使用调度程序分配给它的最大时间,因此当该时间无法进行更多计算时,我想产生当前时间片。
我已经尝试过Thread.yield()
,Thread.onSpinWait()
(尽管我不确定这是否确实按照我的想法做了)和Thread.sleep(0)
。全部要么99%的时间被忽略,要么就是不工作。
似乎有效的一件事是Thread.sleep(x)
,它将我的CPU使用率从〜100%降低到〜2%。但是,睡一段时间后,对我来说似乎是个坏主意。我目前正在编写合成器,因此需要尽快恢复时间,以便重新填充音频缓冲区。
我不能简单地增加音频缓冲区的大小,因为这样做很快会引入非常明显的延迟。
[音频缓冲区已经飙升至每20个左右的“写入周期”就达到80%的空,我担心增加睡眠可能需要太大的音频缓冲区,以免在较弱的系统上出现伪像。
有什么办法可以持续产生我当前的时间片吗?
您可以利用wait
和notify
来控制并发。
由于您的线程共享一个共享资源来交换数据,因此在所述对象上调用wait
将暂停您的Consumer线程,直到Producer通知它为止,因此避免了忙碌的旋转。
阅读材料: