我正在开发一个通过HTTP传输音乐的Java应用程序,我遇到的一个问题是,当应用程序从磁盘读取音频文件并将其发送到客户端时,它通常会将CPU最大化为90-100 %(可能导致用户运行其他应用程序时出现问题).
是否可以控制执行此工作的线程使用较少的CPU,还是需要由OS控制?是否有任何技术可以管理您目前的应用程序密集程度?
我知道你可以启动具有高/低优先级的线程,但在这种情况下,这似乎对我没有任何影响.
(我无法理解"我已经要求计算机做某事,所以它显然会尽可能快地完成它......")
谢谢!
竿.
这项任务(从磁盘读取一个文件,并通过HTTP发送的话)应该不能使用CPU的任何显著量,尤其是在音乐流所需的比特率(除非你在谈论的多通道未压缩的PCM或类似的东西,但即便如此它应该是I/O绑定而不是使用大量的CPU).
你可能以非常低效的方式进行阅读/写作.您是单独读/写每个字节还是使用某种缓冲区?
您可以使用 Thread 中的方法降低其优先级(如有必要,可通过 Thread.currentThread() )。
您还可以在其处理循环中添加延迟(Thread.sleep())。
除此之外,让操作系统来处理它。如果你的程序可以使用 100% CPU,并且没有其他东西需要 CPU,你的应用程序最好使用它,而不是让操作系统空闲任务拥有它。
流数据确实应该是 I/O 绑定的,因此您一定要检查读取数据和发送数据之间所做的事情。例如,您是否正在逐字节读取/发送无缓冲的数据?
编辑:针对 marr75 的评论,我绝对不提倡你编写糟糕的、低效的代码,浪费CPU资源 -我的网站上有一篇文章清楚地表达了我对这种心态的看法。相反,我想说的是,如果您的代码合法地需要 CPU,并且您已优先考虑它以便在用户想做其他事情时表现良好,那么仅仅为了避免挂钩而人为延迟结果就毫无意义CPU - 这只会给用户带来伤害,让他们等待最终结果更长的时间,而他们可能希望尽快得到结果。
| 归档时间: |
|
| 查看次数: |
6857 次 |
| 最近记录: |