Site cover image

fhhm’s blog

複数のFutureのAwait

複数のFutureを持つメソッドをAwaitすると、最初のFutureが完了したタイミングでAwaitが完了する

import scala.concurrent.{Future, Await}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._

def futureSleep10000(): Future[Unit] = Future {
  Thread.sleep(10000)
  println("10,000ms slept")
}

def futureSleep5000(): Future[Unit] = Future {
  Thread.sleep(5000)
  println("5,000ms slept")
}

def callFuncs(): Future[Unit] = {
  for {
    _ <- futureSleep10000()
  } yield ()

  for {
    _ <- futureSleep5000()
  } yield ()
}

Await.result(callFuncs(), Duration.Inf)

// -----result-----
// 5,000ms slept

それぞれAwaitするか、一つのfor comprehension内で呼ぶ(Futureを1つにまとめる)かする

import scala.concurrent.{Future, Await}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._

def futureSleep10000(): Future[Unit] = Future {
  Thread.sleep(10000)
  println("10,000ms slept")
}

def futureSleep5000(): Future[Unit] = Future {
  Thread.sleep(5000)
  println("5,000ms slept")
}

def callFuncs(): Future[Unit] = {
  for {
    _ <- futureSleep10000()
    _ <- futureSleep5000()
  } yield ()
}

Await.result(callFuncs(), Duration.Inf)

// -----result-----
// 10,000ms slept
// 5,000ms slept