Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
Multithreading Scala Future[T]是否在内部阻塞?Scala未来会发生什么?_Multithreading_Scala_Threadpool_Future - Fatal编程技术网

Multithreading Scala Future[T]是否在内部阻塞?Scala未来会发生什么?

Multithreading Scala Future[T]是否在内部阻塞?Scala未来会发生什么?,multithreading,scala,threadpool,future,Multithreading,Scala,Threadpool,Future,未来的代码将在上面的代码块中显示 我的问题是:因为Future使用了ExecutionContext。这是否意味着该线程池中的某些线程在执行其中的代码时将被该线程池阻塞 哪个线程将调用回调?线程池中的另一个线程?它将如何发现在未来执行的代码已完成?假设您正在调用在未来执行的代码: 因为Future使用ExecutionContext。这是否意味着,在执行线程池中的代码时,该线程池中的某些线程将被该线程池阻止 基本上,是的。如果您正在调用阻塞代码,则必须阻塞某些内容。然而,ExecutionCon

未来的代码将在上面的代码块中显示

我的问题是:因为
Future
使用了
ExecutionContext
。这是否意味着该线程池中的某些线程在执行其中的代码时将被该线程池阻塞

哪个线程将调用回调?线程池中的另一个线程?它将如何发现在未来执行的代码已完成?

假设您正在调用在未来执行的代码:

因为Future使用
ExecutionContext
。这是否意味着,在执行线程池中的代码时,该线程池中的某些线程将被该线程池阻止

基本上,是的。如果您正在调用阻塞代码,则必须阻塞某些内容。然而,
ExecutionContext
比线程池更通用。它可以是线程池,但也可以是以其他方式管理调用的东西。尽管如此,有些东西还是会被阻塞,通常是一个线程<例如,code>scala.concurrent.ExecutionContext.Implicits.global就是一个
ForkJoinPool

哪个线程将调用回调

这主要取决于
ExecutionContext
来决定。您可以在回调代码中打印
Thread.currentThread
,但没有任何理由(除了调试)需要了解这些信息。您的代码当然不需要知道。通常,这意味着池中的下一个可用线程,它可能是执行
未来
主体的同一个线程,也可能是另一个线程。执行原始
未来
的线程似乎会分派回调,但这只会安排它们执行

它将如何发现,未来的代码执行已经完成


如果
Future
的基础
Promise
处于已完成状态,调用
onComplete
将立即执行,或者
CallbackRunnable
将添加到待在承诺完成时执行的侦听器列表中
DefaultPromise#tryComplete
将在执行计算后立即调用侦听器。请参阅当前代码的详细信息。

您可以在将来检查线程的ID,以查看它在哪些线程上。感谢您提供了一个非常好的答案。不过我还有一个问题。因为未来是基于线程的,并且它们在内部阻止了一些线程,所以它们不是事件驱动的。并没有什么事情像循环被逐事件执行一样。为什么我们说,未来是“事件驱动的”?(我在Aleksandar Prokopec的“学习Scala中的并发编程”中发现了这一点)@tomdavies因为您可以在Node.js中阻止事件循环,这是否意味着Node.js不是事件驱动的。(也就是说,是谁提出了某些东西不是事件驱动的,是否存在阻止的可能性?@ViktorKlang抱歉,这似乎是一个新手问题,但我最近读了很多这方面的文章,没有找到最终答案。也许我应该重新表述我的问题:Scala Futures基于线程池(默认情况下或多或少),而Node.js基于执行事件的事件循环,那么什么使Scala中的Futures成为事件驱动的呢?事实上,当完成时,附加的回调会被执行吗?@tomdavies你认为执行Node.js事件循环的是什么?@tomdavies Futures是事件驱动的,因为它们的回调/转换是根据相关承诺的完成事件提交执行的。
val future = Future {
   println("hello")
   Thread.sleep(2000)
}

future.onComplete(_ => println("done"))