Java 使用 .forEach 和 .add 的 ForkJoinPool
Java ForkJoinPool with .forEach and .add
我有一个 TicketDTO
对象列表,其中每个 TicketDTO
都需要通过一个函数将数据转换为 TicketDataDTO
。我在这里想要的是将此代码所需的时间减少到 运行 因为当列表大小较大时,转换它需要花费很多时间并且通过 GET 映射获取数据是不可接受的。但是,当我尝试实现 ForkJoinPool
以及 parallelStream)
(下面的代码)来完成它时,我的 return List` 是空的。谁能告诉我我做错了什么?
@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 循环的函数,用于创建我需要的一些新列作为输出。
除了在 ForkJoinPool 上调用 shutdown()
之外,您还必须像
一样等待它的终止
forkJoinPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
如果您不等待终止,data
将在线程有机会向其添加结果之前返回。
见
How to wait for all threads to finish, using ExecutorService?
更多详情
我有一个 TicketDTO
对象列表,其中每个 TicketDTO
都需要通过一个函数将数据转换为 TicketDataDTO
。我在这里想要的是将此代码所需的时间减少到 运行 因为当列表大小较大时,转换它需要花费很多时间并且通过 GET 映射获取数据是不可接受的。但是,当我尝试实现 ForkJoinPool
以及 parallelStream)
(下面的代码)来完成它时,我的 return List` 是空的。谁能告诉我我做错了什么?
@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 循环的函数,用于创建我需要的一些新列作为输出。
除了在 ForkJoinPool 上调用 shutdown()
之外,您还必须像
forkJoinPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
如果您不等待终止,data
将在线程有机会向其添加结果之前返回。
见 How to wait for all threads to finish, using ExecutorService? 更多详情