РЕДАКТИРОВАТЬ: Исправлена ошибка, указанная Андреем Тюкиным
Одним из способов решения вашей проблемы является использование Scala Futures
Документация . Учебник .
Полезный блог Кланга .
Обычно вам потребуется комбинация этих библиотек:
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Await, Future}
import scala.util.{Failure, Success}
import scala.concurrent.duration._
асинхронный пример:
def parallelAsync[A,B](a: => A, b: => B): Future[(A,B)] = {
// as per Andrey Tyukin's comments, this line runs
// the two futures sequentially and we do not get
// any benefit from it. I will leave this line here
// so others will not fall in my trap
//for {i <- Future(a); j <- Future(b) } yield (i,j)
Future(a) zip Future(b)
}
parallelAsync(1 + 2, "a" + "b").onComplete {
case Success(x) => println(x)
case Failure(e) => e.printStackTrace()
}
Если вам нужно заблокировать, пока оба не будут завершены, вы можете использовать это:
def parallelSync[A,B](a: => A, b: => B): (A,B) = {
// see comment above
//val f = for { i <- Future(a); j <- Future(b) } yield (i,j)
val tuple = Future(a) zip Future(b)
Await.result(tuple, 5 second)
}
println(parallelSync(3 + 4, "c" + "d"))
При запуске этих маленьких примеров не забудьте немного поспать в конце, чтобы программа не закончилась, пока результаты не вернутся
Thread.sleep(3000)