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

等待一批期货完成时超时?

晏炳
2023-03-14
for all tasks
  futures.add(executor.submit(new callable(task)))

现在我想让所有的期货最多等待n秒,直到全部完成。我知道我可以调用future#get(timeout),但是如果我在循环中对我的所有期货顺序地调用它,则超时开始增加。伪代码:

for all futures
  future.get(timeout)

get块会出现超时,直到结果就绪。因此,如果第一个在超时之前完成,第二个也在超时之前完成,依此类推,则整个执行时间最多为期货数量*timeout而不是timeout

因此,我正在寻找一个方法,它接受future的列表和一个超时,并行运行所有的结果,然后返回一个未来结果的集合。有什么想法吗?

共有1个答案

戚建德
2023-03-14

您可以使用executorService.invokeAll:

执行给定的任务,返回保存所有任务完成或超时到期(以先发生者为准)时的状态和结果的期货列表。future.isdone()对于返回列表的每个元素都为true。返回时,未完成的任务被取消。请注意,已完成的任务可能已正常终止,也可能通过引发异常终止。如果在此操作进行时修改了给定的集合,则此方法的结果是未定义的。

如果您已经有需要监视的future,并且不能使用invokeall,那么您可以简单地自己测量超时。伪代码:

long endTime = System.currentTimeMillis() + timeoutMS;
for(f : futures)
    f.get(Math.max(0, endTime - System.currentTimeMillis()), TimeUnit.MILLISECONDS);
 类似资料:
  • 我正在Eclipse中使用Java运行selenium RC。我遇到的问题是selenium.click命令。我点击的链接加载一个新页面。有时需要5秒,有时需要2-3分钟。每次我看到页面加载时,在我的测试失败后,我立即得到消息“Timed out waiting for action to finish”。 我尝试使用Selenium.IsElementPresent检查正在加载的页面。但是,当我

  • 它是100%保证的线程,首先得到wait_for_completion_timeout会唤醒第一次调用完成?也许我错了,但是我看了下面的场景:线程A调用wait_for_completion_timeout并进入睡眠。当完成被调用时,它醒来并完成执行在函数do_wait_for_common。现在假设另一个线程B调用wait_for_completion_timeout. x- 然后继续睡觉。所以

  • 我有一系列相同类型的scala期货。 我想在一段有限的时间后,得到整个序列的结果。虽然有些期货可能已经成功,有些可能已经失败,有些还没有完成,但未完成的期货应该被视为失败。 我不想使用“依次等待每个未来”。 我确实看了这个问题:Scala等待未来序列,并尝试从那里使用解决方案,即: 但是我仍然有一个超时异常,我想是因为一些未来还没有完成。答案还指出, 现在,Future.sequence(lift

  • 在Bash脚本中,我想做如下操作: 一、 例如,在后台启动两个应用程序,并给他们60秒时间完成工作。然后,如果他们没有在这段时间内完成,就杀了他们。 不幸的是,上面的方法行不通,因为< code>timeout是一个可执行文件,而< code>wait是一个shell命令。我试着把它改成: 但是这仍然不起作用,因为< code>wait只能在同一个shell中启动的PID上调用。 有什么想法吗?

  • 假设我有几个未来,需要等到它们中的任何一个失败或全部成功。 例如:设有3个期货:、、。 > 如果成功而失败,我不会等待(并将失败返回给客户端)。 如果<code>f2</code>失败,而<code>f1</code>和<code>f3</code>仍在运行,我不会等待它们(并返回故障) 如果成功,然后成功,我继续等待。 你将如何实现它?

  • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?