在我的项目中,有一个返回类型为未来列表的方法。另一个开发人员也这样迭代过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%确定这段代码不会破坏现有的多线程性能或降低性能之前,我无法修改这段代码。
如果您可以更改 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()就足够了吗?