Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用java 8集合并行流处理设置负载平衡?_Java_Multithreading_Parallel Processing_Java 8_Java Stream - Fatal编程技术网

如何使用java 8集合并行流处理设置负载平衡?

如何使用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%(例如) 其主要

我收集了很多元素(可以是100000或更多),处理每个元素的时间从1秒到1分钟不等注意当元素处理耗时1秒时,单个CPU核心的加载少于100%(可能为5%或10%)

因此,我需要以下负载平衡:

  • 创建比CPU核心更多的线程,比如说cpuCoreNumbers*20
  • 使用myCollection.parallelStream().forEach()启动集合处理
  • 当CPU负载小于100%时监控CPU负载,启动下一个元素处理,当CPU负载为100%时停止添加下一个元素,并等待负载小于80%(例如)
  • 其主要思想是创建和使用比CPU核更多的线程来进行“lite收集处理”,并在“重”元素开始处理时减少线程

    可以在Java 8并行流处理期间设置负载平衡吗?

    默认情况下,fork-join池将用于并行流处理。这可能有许多线程与可用处理器的数量相匹配


    监视和解释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提到了一些其他的复杂问题,还有很多其他问题,可能不值得尝试去做你想做的事情。