val future = Future {
println("hello")
Thread.sleep(2000)
}
future.onComplete(_ => println("done"))
以上代码中的代码。
我的问题是:,因为Future
使用了ExecutionContext
。是否意味着此线程池中的某些线程在执行其中的代码时将被此未来阻止?
究竟什么线程会调用回调?来自线程池的另一个线程?如何才能发现在未来内部执行的代码已经完成?
答案 0 :(得分:2)
假设你正在调用阻塞在Future
中的代码:
因为Future使用
ExecutionContext
。是否意味着,在执行其中的代码时,此线程池中的某些线程将被此未来阻止?
基本上,是的。如果您正在调用阻止代码,则必须阻止某些。但是,ExecutionContext
比线程池更通用。它可以是线程池,但它也可以是以其他方式管理调用的东西。仍然会阻止某些东西,通常情况下它会成为一个主题。例如,scala.concurrent.ExecutionContext.Implicits.global
是ForkJoinPool
。
什么线程会完全调用回调?
这主要取决于ExecutionContext
来决定。您可以在回调代码中打印Thread.currentThread
,但没有理由(除了调试之外)为什么您真的需要知道这些信息。您的代码当然不需要知道。通常,这意味着池中的下一个可用线程,它可以是执行Future
主体的相同线程,也可以是不同的线程。看来执行原始Future
的同一个线程将调度回调,但只调度它们以便执行。
如何发现,未来的代码执行已经完成?
如果onComplete
的基础Promise
处于已完成状态,或者Future
将被添加到侦听器列表中,则会立即执行CallbackRunnable
承诺完成后执行。 DefaultPromise#tryComplete
将在计算执行后立即调用侦听器。请参阅当前代码的this excerpt。