Scala futures-哪个线程执行onComplete?
在杰森·古德温的《学习阿卡》一书中,我读到:Scala futures-哪个线程执行onComplete?,scala,concurrency,future,Scala,Concurrency,Future,在杰森·古德温的《学习阿卡》一书中,我读到: val future = getUsernameFromDatabaseAsync(userId) future.onComplete(username => //executed somewhere else println(username) ) 再次突出显示print语句将不会在注册事件的线程上运行,这一点很重要。它将通过ExecutionContext在其他线程上运行。期货始终使用ExecutionContext创建,因此您可
val future = getUsernameFromDatabaseAsync(userId)
future.onComplete(username =>
//executed somewhere else
println(username)
)
再次突出显示print语句将不会在注册事件的线程上运行,这一点很重要。它将通过ExecutionContext在其他线程上运行。期货始终使用ExecutionContext创建,因此您可以选择在何处运行期货
出于好奇,我想亲自检查一下,所以我准备了一个片段:
val myFuture = Future {
println("in future: " + Thread.currentThread().getName())
Thread.sleep(1000)
}
myFuture.onComplete {
case _ ⇒ println("in onComplete: " + Thread.currentThread().getName())
}
println("main: " + Thread.currentThread().getName())
Await.result(myFuture, 10 seconds)
每次运行代码段时,我都会得到以下输出
main: main
in future: ForkJoinPool-1-worker-13
in onComplete: ForkJoinPool-1-worker-13
Future和onComplete在同一个线程上执行,但书中说,onComplete可能在不同的线程上执行回调。
如何解释它?因为注册事件的线程是主线程,而不是运行未来的线程。在本例中,它不是在线程main上运行,而是在线程ForkJoinPool-1-worker-13上运行 onComplete和future可以在同一个线程上运行,因为onComplete只在future结束后才开始。文档只是说明它们将在不同于主线程的线程上运行