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

Future.get()未返回所有结果

钱黎明
2023-03-14

我正在创建,比如说,15个Callable任务,并提交它们:

List<Future<MyResult>> futures = new ArrayList<Future<MyResult>>();
List<MyResult> myResults = new ArrayList<MyResult>();

for(int i = 1; i <= 15; i++){
    Callable<MyResult> task = new MyProcessor(//parameters);
    Future<MyResult> future = executorService.submit(task);
    futures.add(future);//used to iterate over to call get() to collect results in next for loop
}

然后我收集15个MyResult对象:

for(Future<MyResult> future : futures){
  try {
    MyResult myResult = future.get();
    processorResults.add(myResult);
    } catch (InterruptedException e) {
      //...
    } catch (ExecutionException e) {
      //...
    }
}

问题是:我没有从get()方法获得所有15个MyResult对象,而是有时获得不到15个对象。有时12有时10有时甚至更少,有时全部15。

我的印象是,get()方法是一个阻塞调用,将等待所有15个线程返回各自的结果,但看起来我错过了其中的一些线程并继续前进。我做错了什么?我是否未正确收集结果/等待结果?当任何MyProcessor任务抛出错误时,是否会发生这种情况?

共有1个答案

杨豪
2023-03-14

这可能意味着你的一些工作抛出了一个例外。从你的代码中很难判断,但是你需要做一些事情,除了捕捉和忽略它。

Future.get()当您提交的Callablecall()方法抛出RuntimeException时,抛出ExecutionException。如果方法使用return正常返回,它将仅返回您的MyResult。您可以通过执行以下操作获取引发的异常:

} catch (ExecutionException e) {
    // account for the throw here, the original exception is in e.getCause()
    // log it, count it, or ...
    logger.error("Job threw exception: " + e.getCause());
}

我的印象是get()方法是一个阻塞调用,将等待所有15个线程返回相应的结果,

这是正确的。当您调用future.get()时,该函数将一直阻塞,直到作业完成为止—通过抛出异常或返回。如果执行get()的线程被中断,那么get()抛出一个InterruptedException,该异常也应该被捕获,而不仅仅是忽略。

 类似资料:
  • 我有三个索引,它们都共享一个特定的键值对。当我用api进行全面搜索时”http://localhost:9200/_search“使用请求正文 它只返回其中两个索引的结果。我尝试使用相同的请求正文,将url更改为仅在丢失的索引中搜索”http://localhost:9200/index_name/_search“这很管用。我有什么遗漏吗? 插入所有三个索引的代码遵循相同的过程,我使用elasti

  • 我从sql检索数据并存储在列表中。然后我将它转换为GenericEntity并尝试使用response.Entity().build()返回它;但它只返回第一个项目。 我确认清单上包含了所有的项目。所以问题应该是列表到实体的转换和/或响应的返回。我尝试循环响应部分,但它没有工作。 List List=new arraylist<>();字符串stmt=“”;PreparedStatement PS

  • 我正在为EJB服务开发一个REST-facade,这意味着它调用EJB,将结果转换为REST调用者将理解的表示,然后返回它(作为json或xml)。所有这些都非常出色。但是EJB服务抛出了各种异常,例如,当没有找到结果或其他一些不同的情况下。因为我不希望那些传播到REST调用者,所以我实现了一个ExceptionMapper: 我的EJB服务中的所有异常都以,此映射程序可以很好地捕获它,原因是应用

  • 我有一个C#代码,使用Elastic搜索类型,它将匹配两个字段。我用的是NEST软件包。 问题是,无论我传入什么文本,它都会返回所有结果。我错过了什么?

  • 我已经发布了一个层,其中包含大约76列(属性)。但是,当我调用WFS服务时,它没有返回所有属性(列),会遗漏一个名称为“id”的属性(列)。我使用的是oracle Spatial 11g数据库,其中包含地图数据。我是不是漏掉了什么?所有其他的事情都工作得很好,就像WMS服务一样。

  • 我试图从一个网站刮数据练习网络刮。但是返回空集。我如何解决这个问题? 输出: