Java 如何生成当前的cpu时间片

Java 如何生成当前的cpu时间片,java,scheduling,Java,Scheduling,我有一个java程序,其中包含一个必要的无限循环。显然,只要保持循环的原样,程序就会使用调度器给它的最长时间,所以我想在没有更多计算的情况下生成当前时间片 我已经尝试了Thread.yield(),Thread.onSpinWait()(虽然我不确定这是否真的像我想的那样),以及Thread.sleep(0)。99%的情况下,所有这些都会被忽略,或者根本不起作用 有一件事似乎确实有效,那就是线程.sleep(x),它将我的cpu使用率从~100%降至~2%。然而,睡一段时间对我来说似乎是个坏主意

我有一个java程序,其中包含一个必要的无限循环。显然,只要保持循环的原样,程序就会使用调度器给它的最长时间,所以我想在没有更多计算的情况下生成当前时间片

我已经尝试了
Thread.yield()
Thread.onSpinWait()
(虽然我不确定这是否真的像我想的那样),以及
Thread.sleep(0)
。99%的情况下,所有这些都会被忽略,或者根本不起作用

有一件事似乎确实有效,那就是
线程.sleep(x)
,它将我的cpu使用率从~100%降至~2%。然而,睡一段时间对我来说似乎是个坏主意。我现在正在写一个synth,所以需要尽快将我的时间片倒回去,以便重新填充音频缓冲区

我不能简单地增加音频缓冲区的大小,因为这样做会很快引入非常明显的延迟

音频缓冲区已经达到每20个左右的“写入周期”就有80%为空,我担心添加睡眠可能需要太大的音频缓冲区,以避免较弱系统上出现瑕疵


有没有办法一致地生成我的当前时间片?

您可以利用
等待
通知
来控制并发性

由于您的线程共享一个公共资源来交换数据,在所述对象上调用
wait
将暂停您的消费线程,直到生产者通知它,从而避免繁忙的旋转

阅读材料:


您可以利用
等待
通知
来控制并发

由于您的线程共享一个公共资源来交换数据,在所述对象上调用
wait
将暂停您的消费线程,直到生产者通知它,从而避免繁忙的旋转

阅读材料:


您能否再多发布一点关于如何将音频输入程序的信息?这听起来像是有一个轮询线程、工作线程和主线程来启动,这两个线程都应该充分利用您的CPU,但如果不知道更多关于数据如何进入的信息,很难说。@kingkupps我自己一次生成512字节的音频(对波形进行采样),并将这些数据块写入SourceDataLine。无限循环每个周期只做这两件事。Thread.yield()产生时间片,但如果没有其他线程使用它,调度程序将再次运行线程;因此,100%您可以发布更多关于如何将音频输入到您的程序中的信息吗?这听起来像是有一个轮询线程、工作线程和主线程来启动,这两个线程都应该充分利用您的CPU,但如果不知道更多关于数据如何进入的信息,很难说。@kingkupps我自己一次生成512字节的音频(对波形进行采样),并将这些数据块写入SourceDataLine。无限循环每个周期只做这两件事。Thread.yield()产生时间片,但如果没有其他线程使用它,调度程序将再次运行线程;因此,100%不幸的是,我没有从缓冲区中删除数据,只是添加数据,所以一旦空间可用,我就没有办法做任何事情,因此我当前的代码检查是否有空间,如果没有,就会休眠。不幸的是,我没有从缓冲区中删除数据,只是添加数据,因此,一旦空间可用,我就没有办法做任何事情,因此我当前的代码检查是否有空间,如果没有,就休眠。