java forkjoinpool with.foreach and.add

hlswsv35  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(292)

我有一份 TicketDTO 每个 TicketDTO 需要通过函数将数据转换为 TicketDataDTO . 这里我想要的是减少代码运行所需的时间,因为当列表大小较大时,转换它需要大量时间,并且通过getMap获取数据是不可接受的。然而,当我试图实现 ForkJoinPool 以及 parallelStream) (下面的代码)为了完成它,我的返回列表是空的。有人能告诉我我做错了什么吗?

@Override
public List<TicketDataDTO> getOtrsTickets(String value, String startDate, String endDate, String product, String user) {
  // TODO Implement threads
  List<TicketDTO> tickets = ticketDao.findOtrsTickets(value, startDate, endDate, product, user);
  Stream<TicketDTO> ticketsStream = tickets.parallelStream();
  List<TicketDataDTO> data = new ArrayList<TicketDataDTO>();

  ForkJoinPool forkJoinPool = new ForkJoinPool(6);

  forkJoinPool.submit(() -> {
    try {
      ticketsStream.forEach(ticket -> data.add(createTicketData(ticket)));
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  });

  forkJoinPool.shutdown();

  //ticketsStream.forEach(ticket -> data.add(createTicketData(ticket)));

  return data;
``` `createTicketData` 只是一个带有两个for循环和一个switch循环的函数,用于创建一些新的列作为输出。
91zkwejq

91zkwejq1#

电话之外 shutdown() 在forkjoinpool上,您必须等待它的终止,就像

forkJoinPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);

如果你不等待终止协议, data 将在线程有机会向其添加结果之前返回。
查看如何使用executorservice等待所有线程完成?更多细节

相关问题