等待监听器完成内部循环[复制]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我正在开发一个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等。最后,对于阵列上的所有pdfs,它应该压缩文件。

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

循环应该在迭代之前等待监听器。我怎样才能做到这一点?

java multithreading
1个回答
-1
投票

我会使用并行流。就像是:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.