Самое близкое, что вы можете сделать, это использовать какое-то общее условие, которое используют обе функции:
def runConcurrently(f1: => Int, f2: => Int): Future[(Int, Int)] =
Future(f1) zip Future(f2)
val sem1 = new Semaphore(0)
val sem2 = new Semaphore(0)
def f1 = {
sem1.release
sem2.acquire
1
}
def f2 = {
sem2.release
sem1.acquire
2
}
Await.result(runConcurrently(f1, f2), 1 second) shouldBe (1,2)
Идея состоит в том, что ни одна из функций не может завершиться до того, как другая хотя бы запустится.Таким образом, попытка запустить их последовательно никогда не закончится, и вы получите тайм-аут.
В частности, этот код не будет работать, если вы попытаетесь запустить его с однопоточным контекстом выполнения.