当前位置: 首页 > 知识库问答 >
问题:

处理多个异步操作并分别进行进一步处理的最佳方式是什么?

宗政昱
2023-03-14

在我的项目中,有一个返回类型为未来列表的方法。另一个开发人员也这样迭代过for循环

public List<Future<Object>> method1(){
    List<Future<Object>> lists = new ArrayList();
    for(MultipartFile file : files){
      Future<Object> future = service.method2(file);
      lists.add(future);
    }
   return lists;
}

现在,我必须在处理列表的对象后立即对它执行某些操作。我该怎么做?即使我把一个for循环像

for(Future<Object> future : lists){
  if(future.isDone()){
       performOtherOperation(future.get());
  }
}

如果第一个对象未被处理,isDone()条件将失败,它将被忽略,第二次迭代将开始,我如何处理它?

这也可以使用ExecutorService完成吗??我不熟悉ExecutorService。

编辑:所以我编辑了服务类的方法2(文件

public Future<Object> method2(File){
  object = operation();
  return new AsyncResult(object);
}

公开可完成的未来方法2(文件);

但是我应该选择与AsyncResult等价的返回类型。AsyncResult是Spring框架的一个实现。

在我100%确定这段代码不会破坏现有的多线程性能或降低性能之前,我无法修改这段代码。

共有1个答案

陆野
2023-03-14

如果您可以更改 service.method2 以返回 CompletableFuture,那么问题就变得微不足道了:

for(CompletableFuture<Object> future : lists){
  future.whenComplete((obj, err) -> performOtherOperation(obj));
}

如果您绝对不能修改method2,那么您可以将Future对象转换为CompletableFutures,如将Java Future转换为CompleableFuture中所述

 类似资料:
  • 我有一个超时执行任务的方法。我使用ExecutorServer.submit()获取一个Future对象,然后调用future.get()并超时。这很好,但是我的问题是处理我的任务可能抛出的检查异常的最好方法。下面的代码工作正常,并且保留了被检查的异常,但是如果方法签名中被检查的异常的列表改变了,它看起来非常笨拙并且容易出错。 关于如何解决这个问题的任何建议?我需要以Java 5为目标,但我也很好

  • 问题内容: 我是Node的新手,并试图确保我对JSON驱动的Web应用程序使用了合理的设计。 我已经在Redis中存储了一堆数据,并且正在通过node检索它们,并将结果从Redis中流出来。这是我正在做的一个很好的例子: 本质上,我是从Redis获取一组密钥,然后请求每个密钥,然后将结果流式传输到半手动创建的JSON(来自Redis的字符串已经在JSON中)。现在,这很好用,但是我不禁会以为i =

  • 我正在尝试进行大量的外部服务调用,每个调用都遵循异常处理和有条件的进一步处理。我认为使用内部的. on完成来扩展这个不错的(Scala中带有期货的异步IO)示例会很容易,但似乎我对范围和/或期货有些不理解。有人能给我指出正确的方向吗? 在我的电脑上(Scala 2.10.4 ),这打印出来: 我要(顺序不重要):

  • 问题内容: 将NodeJS与MongoDB + Mongoose结合使用。 首先,我知道异步非阻塞代码的优点。所以我确实处理回调。但是最后我遇到了以下问题。 可以说我有一个可以随时被用户调用的函数。超级“闪电般的”用户可能几乎同时调用两次。 当然它是这样执行的:查找查询,查找查询,保存查询,保存查询 这完全破坏了应用程序的逻辑(应查找查询,保存查询,查找查询,保存查询)。因此,我决定通过“锁定”特

  • 在Servlet 3.0中,引入了异步处理的概念。所以所有的书都说这消除了每个请求一个线程的要求。我已经测试过了,是的,它确实有效。现在,我有一个简单的servlet,用户在其中以同步模式启动HTTP请求。线程只需Hibernate1秒,然后回复客户端。当我对这种模式进行负载测试时,服务器每秒只能处理4个请求。现在,我将同步模式更改为异步模式,并根据请求创建一个新线程,将原始http线程释放回池。

  • 如果这被认为是一个可接受的实践,我需要什么-如果有-错误处理?我的理解是,task.wait()将重新抛出异步操作抛出的任何异常,并且我没有提供任何取消异步操作的机制。仅仅调用task.wait()就足够了吗?