我有一种情况,我希望将来同时执行多个任务,以便如果其中一个失败,其他任务仍然会执行。 如果一个失败,我想记录它的错误。 我希望我的父线程能够判断每个线程是否成功,然后基于此执行某些操作。例如,如果其中一个期货失败,请打印"嘿,其中一个期货失败"
val futureA = Future(doTaskThatReturnsABoolean)
val futureB = Future(doTaskThatReturnsABoolean)
val futureC = Future(doTaskThatReturnsABoolean)
futureA.onFailure (case t => println(future A failed ) + t.getMessage)
futureB.onFailure (case t => println(future B failed ) + t.getMessage)
futureC.onFailure (case t => println(future C failed ) + t.getMessage)
if (one of these futures failed) {
println("One of the futures failed")
throw new someNewError
}
如果任何或所有期货都失败了,我想记录他们的堆栈跟踪,但我不想让我的整个程序出错,直到所有期货都有机会运行。因为他们可能因为不同的原因而全部出错,我不想重复他们的错误,我想抛出一个新错误。
我一直在阅读http://docs.scala-lang.org/overviews/core/futures.html,但我无法理解这一点。
我不想使用" Await"因为这需要一段时间,我想给期货提供他们想要运行的尽可能多的时间。让我们暂时假设他们会#34;"完成但在未确定的时间范围内完全取决于数据大小。
答案 0 :(得分:5)
应该是这样的:
val futureA = Future(doTaskThatReturnsABoolean).recoverWith{
case e:Throwable => println(future A failed ) + t.getMessage; Future.failed(e)
}
val futureB = Future(doTaskThatReturnsABoolean).recoverWith{
case e:Throwable => println(future B failed ) + t.getMessage; Future.failed(e)
}
val futureC = Future(doTaskThatReturnsABoolean).recoverWith{
case e:Throwable => println(future failed ) + t.getMessage; Future.failed(e)
}
val futures = List(futureA, futureB, futureC)
Future.sequence(futures).recoverWith{
case p:Throwable => println("One of the futures failed"); Future.failed(new SomeNewError)
}
Future.sequence
辅助方法将期货集合转换为包含结果集合的未来。如果其中一个来源期货失败,则结果未来将失败。