Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala futures-哪个线程执行onComplete?_Scala_Concurrency_Future - Fatal编程技术网

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结束后才开始。文档只是说明它们将在不同于主线程的线程上运行