Scala waiting for sequence of futures

后端 未结 6 2320
野的像风
野的像风 2020-12-04 15:39

I was hoping code like follows would wait for both futures, but it does not.

object Fiddle {
  val f1 = Future {
    throw new Throwable(\"baaa\") // emulat         


        
6条回答
  •  甜味超标
    2020-12-04 16:21

    This is an example that supports the previous answer. There is an easy way to do this using just the standard Scala APIs.

    In the example, I am creating 3 futures. These will complete at 5, 7, and 9 seconds respectively. The call to Await.result will block until all futures have resolved. Once all 3 futures have completed, a will be set to List(5,7,9) and execution will continue.

    Additionally, if an exception is thrown in any of the futures, Await.result will immediately unblock and throw the exception. Uncomment the Exception(...) line to see this in action.

      try {
        val a = Await.result(Future.sequence(Seq(
          Future({
            blocking {
              Thread.sleep(5000)
            }
            System.err.println("A")
            5
          }),
          Future({
            blocking {
              Thread.sleep(7000)
            }
            System.err.println("B")
            7
            //throw new Exception("Ha!")
          }),
          Future({
            blocking {
              Thread.sleep(9000)
            }
            System.err.println("C")
            9
          }))),
          Duration("100 sec"))
    
        System.err.println(a)
      } catch {
        case e: Exception ⇒
          e.printStackTrace()
      }
    

提交回复
热议问题