Java 8 : Parallel stream to wait until all the threads finishes the task

标签 java java-8 java-stream

<分区>

使用并行流将具有大量数据的大量文件写入特定格式。 这是代码:

public static void main(String[] args) throws Exception {
   mergeController.compactFiles();
   mergeController.writeMergedFlag();
}
private void compactFiles() {
  Set<String> events = this.listSubDirectoryNames(inputDir);
  events.parallelStream().forEach(event -> writeEvent(event, eventSchemaMap.get(event), this.configuration));
}

这些方法不会返回任何内容,因为它们只是在写入文件。我看到 writeMergedFlag() 主要是在进程运行 1.5 小时后被调用。

这里的问题是什么?是堆空间问题还是其他? 我以前从未遇到过此类问题。

最佳答案

我认为这是因为并行流使用了一个具有固定数量线程的 ForkJoinPool。如果这些 writeEvent 任务很小,我建议改用缓存线程池:

public static void main(String[] args) throws Exception {
    mergeController.compactFiles();
    mergeController.writeMergedFlag();
}

private void compactFiles() {
    Set<String> events = this.listSubDirectoryNames(inputDir);
    ExecutorService service = Executors.newCachedThreadPool();
    events.forEach(event -> service.execute(() -> writeEvent(event, eventSchemaMap.get(event), configuration)));
    service.shutdown();
    service.awaitTermination(1, TimeUnit.DAYS); // Arbitrary value
}

关于Java 8 : Parallel stream to wait until all the threads finishes the task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51507144/

相关文章:

java - 创建按钮 GUI 面板

java-8 - 相当于来自 guava Enums.getIfPresent() 的 java 8 将返回 java.util.Optional?

java - 有没有一种首选方法可以将列表流收集到一个平面列表中?

java - 分流器实现细节

Java-8:如何在忽略区分大小写的情况下使用 Map.Entry#comparingByValue 对 Map(基于值)进行排序?

java - 调用时更改从 Netbeans 运行的 Tomcat 的 Java 版本

java - 在 JSF 2.0 中使用@ViewScoped?

javascript - AMCharts x 轴上的时间戳

java - 使用 java 8 方法引用的 Null Check 方法可能吗?

java - Java 8中列表的二级过滤