Multithreading Scala未来执行
我有两个未来。我想按顺序执行它们。例如:Multithreading Scala未来执行,multithreading,scala,future,executioncontext,Multithreading,Scala,Future,Executioncontext,我有两个未来。我想按顺序执行它们。例如: val ec: ExecutionContextExecutor = ExecutionContext.Implicits.global val first=Future.successful(...) val second=Future.successful(...) 当第一个完成时,则应执行第二个。问题是second应该返回Future[Object]而不是Future[Unit]so 我无法使用已完成、和第三个等函数 我无法使用wait或Thre
val ec: ExecutionContextExecutor = ExecutionContext.Implicits.global
val first=Future.successful(...)
val second=Future.successful(...)
当第一个完成时,则应执行第二个。问题是second应该返回Future[Object]
而不是Future[Unit]
so
我无法使用已完成、和第三个
等函数
我无法使用wait
或Thread.sleep(…)
我不能使用for循环,因为执行上下文是这样定义的
first.flatmap(=>second)
将不按顺序执行。
我该怎么做呢?一旦您将
未来
分配给val,该未来
将被安排并尽快执行。要防止出现这种情况,您有两种选择:
def
未来
用于(
i一旦您将未来
分配给val,该未来
将被安排并尽快执行。要防止出现这种情况,您有两个选项:
在def
定义要在哪里使用它的未来
下面是#1的一个例子:
下面是#2的一个例子:
用于(
我只是把second
设为def
而不是val
?也许你可以对firstFuture
进行一些轮询来完成,完成后运行第二个。按照@SaschaKolberg的建议,尝试将first
和second
定义为def
,而不是val
,然后是first。flatmap(=>second)
将按顺序完成这两个期货。(没有必要将first
定义为def
,但为了对称性,这似乎很好。如果first是def
,则引用first将重新执行Future。成功(…)
)当second获取第一个值时,它返回。它不会等到first完成。只需将second
设置为def
而不是val
?也许您可以使用firstFuture
的一些轮询来完成,完成后运行第二个。按照@SaschaKolberg的建议,尝试一下将first
和second
定义为def
而不是val
,然后首先定义。flatmap(=>second)
将按顺序完成两个期货。(没有必要将first
定义为def
,但为了对称性,它似乎很好。如果first是def
,引用first将重新执行未来。成功(…)
)它不起作用,因为当second取第一个值时,它返回。它不会等到first完成。
def first: Future[Int] = Future { Thread.sleep(5000); 1 }
def second(i: Int): Future[Unit] = Future { println(i) }
first.flatMap(i => second(i))
for(
i <- Future { Thread.sleep(5000); 1 };
_ <- Future { println(i) }
) yield ()