等待监听器在循环内完成

时间:2018-08-08 18:56:29

标签: java multithreading

我正在研究一种Java方法,该方法接收项目列表,为每个项目生成一个报告(PDF文件),最后将所有这些PDF文件压缩为一个zip文件。

这是我的简化方法:

List<File> pdfs = new ArrayList<File>();

public void generateZipOfItems(List<Item> items) {
  for(Item item : items) {
    ReportThread report = generatePDFReport(item);

    report.addListener(new ReportExecuteListener() {
      @Override
      public void finishReport(ReportExecutionEvent reportExecutionEvent) {
         // when report is finished, add the PDF file on arrayList
         pdfs.add(reportExecutionEvent.getReport());
      }
  }

  createZipFromFileList(pdfs); // this method just zip the files, and it is working very well

}

在理想情况下,该方法应生成项目A的报告,将其添加到“ pdfs”数组中,并重复执行项目B,C等。最后,所有pdf都放在数组中,应该将文件压缩。

问题是,循环没有等待侦听器完成生成报告文件,并且正在创建不包含项目的zip文件。

循环应在迭代之前等待侦听器。我该怎么办?

1 个答案:

答案 0 :(得分:-1)

我会使用并行流。像这样:

 createZipFileFromFileList(items.parallelStream()
                                .map(item -> generatePDFReport(item))
                                .collect(Collectors.toList()));

编辑:在此重构中,generatePDFReport()将返回生成的PDF对象本身,而不是ReportThread