如何使用java 8集合并行流处理设置负载平衡?
我收集了很多元素(可以是100000或更多),处理每个元素的时间从1秒到1分钟不等注意当元素处理耗时1秒时,单个CPU核心的加载少于100%(可能为5%或10%) 因此,我需要以下负载平衡:如何使用java 8集合并行流处理设置负载平衡?,java,multithreading,parallel-processing,java-8,java-stream,Java,Multithreading,Parallel Processing,Java 8,Java Stream,我收集了很多元素(可以是100000或更多),处理每个元素的时间从1秒到1分钟不等注意当元素处理耗时1秒时,单个CPU核心的加载少于100%(可能为5%或10%) 因此,我需要以下负载平衡: 创建比CPU核心更多的线程,比如说cpuCoreNumbers*20 使用myCollection.parallelStream().forEach()启动集合处理 当CPU负载小于100%时监控CPU负载,启动下一个元素处理,当CPU负载为100%时停止添加下一个元素,并等待负载小于80%(例如) 其主要
监视和解释CPU利用率是一项非常重要的任务。超线程、节能功能、turbo boost功能等使这一问题变得复杂。无论您使用什么样的工具进行监控,似乎都在愚弄您。没有“光处理”模式。当一个元素的处理只需要很短的时间段时,它仍然会在该时间段内消耗100%的CPU。您的监控工具可能会平滑这些值,例如,当满载500 ms,空载500 ms时,它可能会在1s内打印50%。但是,如果说元素使用了50%的CPU进行处理,那将是一种完全错误的解释 只有一种情况下,项目的处理不会完全消耗CPU,并且使用更多线程可以提高核心的使用率:当有大量时间项目没有实际处理时,即线程将被阻塞,因为它等待另一个线程或I/O操作的结果。您应该知道处理任务何时涉及I/O或额外的线程同步(如果是这样的话,我假设您在问题中提到了这一点)
但是,当您一个接一个地处理100000个元素时,处理单个项目所需的时间并不重要,因为CPU会在完成一个项目后立即处理下一个项目,从而保持忙碌状态。因此,即使是具有平滑功能的监控工具也应该显示100%的CPU负载。如果没有,则会涉及一些阻塞,这可能是管道的后续操作或并行化框架的一般开销。然后,您必须分析I/O操作以找到正确的策略。如果后续的I/O成为瓶颈,那么产生更多的线程来加速计算也无济于事。总之,不是。JVM是一个虚拟机。您的应用程序无法访问实际计算机。您可以使用管理API来访问Java线程,但这对应用程序来说是一个很大的开销@Brett Okken提到了一些其他的复杂问题,还有很多其他问题,可能不值得尝试去做你想做的事情。