Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有.forEach和.add的Java ForkJoinPool_Java_Arrays_Spring Boot_Threadpool_Parallel.foreach - Fatal编程技术网

带有.forEach和.add的Java ForkJoinPool

带有.forEach和.add的Java ForkJoinPool,java,arrays,spring-boot,threadpool,parallel.foreach,Java,Arrays,Spring Boot,Threadpool,Parallel.foreach,我有一个TicketDTO对象列表,其中每个TicketDTO都需要通过一个函数将数据转换为TicketDTO。这里我想要的是减少代码运行所需的时间,因为当列表大小较大时,转换它需要大量时间,并且通过GET映射获取数据是不可接受的。然而,当我试图实现ForkJoinPool以及parallelStream)(下面的代码)来完成它时,我的返回列表`是空的。有人能告诉我我做错了什么吗 @Override public List<TicketDataDTO> getOtrsTickets(

我有一个
TicketDTO
对象列表,其中每个
TicketDTO
都需要通过一个函数将数据转换为
TicketDTO
。这里我想要的是减少代码运行所需的时间,因为当列表大小较大时,转换它需要大量时间,并且通过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;
@覆盖
公共列表getOtrsTickets(字符串值、字符串开始日期、字符串结束日期、字符串产品、字符串用户){
//TODO实现线程
List tickets=ticketDao.findotrstikets(值、开始日期、结束日期、产品、用户);
Stream ticketstream=tickets.parallelStream();
列表数据=新的ArrayList();
ForkJoinPool ForkJoinPool=新的ForkJoinPool(6);
forkJoinPool.submit(()->{
试一试{
ticketstream.forEach(ticket->data.add(createTicketData(ticket));
}捕获(例外e){
抛出新的运行时异常(e);
}
});
forkJoinPool.shutdown();
//ticketstream.forEach(ticket->data.add(createTicketData(ticket));
返回数据;

createTicketData
只是一个带有两个for循环和一个switch循环的函数,用于创建我需要的一些新列作为输出。

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

forkJoinPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
如果不等待终止,
数据将在线程有机会将其结果添加到数据之前返回


有关详细信息

您正在从多个线程修改单个ArrayList,而没有执行任何类型的同步。即使您解决了眼前的问题,这也会导致错误。我建议您使用
collect(Collectors.toList())阅读并改为使用无副作用的方法
。此外,不支持在并行流中使用自定义ForkJoinPool。最好显式调用
ExecutorService。提交
invokeAll
以获取未来列表并等待它们。