【问题标题】:Java Parallel processing with return valueJava 带返回值的并行处理
【发布时间】:2019-10-01 11:42:47
【问题描述】:
List<String> lines = FileUtils.readLines(dataFile,"UTF-8");
lines.parallelStream().forEachOrdered(line->processRecord(line, dataFileName)); 

这里的流程记录将返回字符串值如何存储到任何集合/文件中

可以帮助我。感谢您的提前。

【问题讨论】:

  • processRecord 有什么作用?它是返回一些东西(return value)还是直接更改一些文件?
  • processRecord 方法将循环传递我们传递的行并转换为 xml,然后在我们调用其他应用程序之后,我们将此 xml 传递给该应用程序。它会将响应返回给我们。我将捕获所有行的请求和响应。
  • 那么,您是否要将请求line 和响应response from processRecord 存储到某个位置?如果是这样,您可以使用地图。如果不确定如何,那么我可以为您写一个答案。
  • 我正在处理的文件,如果它是匹配请求和响应的好顺序。
  • 如果您只想匹配请求和响应,那么无论如何都不需要排序..

标签: java foreach parallel-processing return


【解决方案1】:

您可以使用 map 来执行和存储每个输入的结果,而不是使用 forEachOrdered。然后,您可以将它们收集到一个新列表中以存储结果。

例子:

        List<String> result = lines.parallelStream()
            .map(line->line.toUpperCase())
            .collect(Collectors.toCollection(ArrayList::new));

【讨论】:

  • 谢谢,我正在使用如下。 List outList=lines.parallelStream() .map(line->processRecord(line,dataFileName)).collect(Collectors.toCollection(ArrayList::new));这个方法会有多少线程并行执行?
  • @Gopal8123775498 如果我没记错的话,基本上它的作用是将执行“排队”,直到核心可用。基本上意味着它可以用来处理信息的线程数量小于或等于你拥有的 cpu 核心数量减一。因此,例如,如果您有一个具有 8 个内核的 CPU,假设它们都可用,它可以同时使用其中的 7 个。欲了解更多信息:stackoverflow.com/a/30802737/5130640
【解决方案2】:

[答案基于cmets]

假设您要处理String的列表,并且还希望将每个处理的响应与输入和输出一起存储,那么您可以按照以下方法。

 List<String> lines = FileUtils.readLines(dataFile,"UTF-8");
 Map<String, String> result = lines.parallelStream()
       .collect(Collectors.toMap(line -> line, line -> processRecord(line, dataFileName)));

在这里,result(一个简单的Map&lt;Key, Value&gt;)将同时包含.. 作为每一行的键,以及作为processRecord 方法返回的每一行的响应 .

多少线程将并行执行这个方法(来自 cmets)

方法parallelStream() 使用DefaultForkJoinPool 形式的线程。此池的默认大小等于您系统上的number of cores

【讨论】:

    猜你喜欢
    • 2019-04-10
    • 2019-01-06
    • 2018-07-18
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 2011-05-08
    • 2013-09-30
    • 1970-01-01
    相关资源
    最近更新 更多