Java ForkJoinPool with .forEach and .add



我有一个TicketDTO对象列表,每个TicketDTO都需要通过一个函数将数据转换为TicketDataDTO。我在这里想要的是减少运行此代码所需的时间,因为当列表大小较大时,转换它需要花费大量时间,并且通过 GET 映射获取数据是不可接受的。但是,当我尝试实现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 循环和一个开关循环来创建我需要作为输出的一些新列。

除了在 ForkJoinPool 上调用shutdown()之外,您还必须等待其终止,例如

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

如果不等待终止,则在线程有机会将其结果添加到其中之前,将返回data

看 如何使用执行器服务等待所有线程完成? 了解更多详情

最新更新