用例 scala.concurrent.block

我偶然发现了 scala.concurrent.blocking方法,而 根据 Scala 文档是..。

用于指定一段代码,该代码可能阻塞,允许 当前的 BlockContext 来调整运行库的行为 标记阻塞代码可以提高性能或避免死锁。

我有些疑问:

  • 产生新线程的因素是什么?
  • 这仅适用于 scala.concurrent.ExecutionContext.Implicits.global执行上下文还是也适用于用户创建的执行上下文?
  • 如果我用 blocking {... }包装任何可执行文件会发生什么?
  • 任何我们应该使用这个构造的实际用例。
18988 次浏览
  1. 检测到新线程时,将在 fork/join 池中产生新线程 Fork/join 池中的所有线程都在等待对方 使用 join构造,还有更多的工作要完成 有可能完成其中一个线程。 或者,如果其中一个 ForkJoinWorker线程正在执行除使用 join之外的阻塞代码,它可以使用 ManagedBlocker通知池。
  2. 它可能适用于任何类型的执行上下文——它作为对 ExecutionContext实现的通知,通知工作线程执行的代码可能在某些情况下被阻塞,并且这种情况可以通过使用其他线程计算其他东西来解决。执行上下文可能会也可能不会对此进行操作。在当前(2.10,2.11)实现中,blocking将仅与默认的全局执行上下文一起工作。
  3. 如果用阻塞包装任何可执行文件,都会产生一点运行时开销,所以不要总是这样做。
  4. 如果你有一个持续很长时间的计算,比如几秒或几分钟,或者你正在等待一个未来使用 Await完成,或者你正在等待一个监视器的条件得到解决,这个条件可以通过其他任务/未来在相同的执行上下文中执行来解决——在所有这些情况下,你应该使用 blocking

编辑:

考虑看一下 学习 Scala 中的并发编程中的第4章。