Java 8:并行流等待所有线程完成任务

时间:2018-07-24 20:36:38

标签: 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小时后大部分被调用。

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

2 个答案:

答案 0 :(得分:4)

我认为这是因为并行流利用了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
}

答案 1 :(得分:1)

默认情况下,JVM中的所有false都使用具有parallelStream()工作线程的相同ForkJoinPool.commonPool()。 因此,在您的情况下,您首先需要与事件探查器一起检查消耗时间,并且如果只是要处理大量文件,则可以为并行流使用自定义线程池。

numberOfCPUs - 1

http://www.baeldung.com/java-8-parallel-streams-custom-threadpool

相关问题