Scala 计算ExecutionContext中的线程数

Scala 计算ExecutionContext中的线程数,scala,concurrency,executioncontext,Scala,Concurrency,Executioncontext,假设我想知道给定的ExecutionContext中有多少线程 所以我写了一个这样的函数 def count(implicit ec: ExecutionContext): Int = { val promise = Promise[Unit] val counter = new AtomicInteger(0) for (_ <- 0 to 1000) Future { counter.getAndIncrement() Await.ready(promise

假设我想知道给定的
ExecutionContext
中有多少线程
所以我写了一个这样的函数

def count(implicit ec: ExecutionContext): Int = {
  val promise = Promise[Unit]
  val counter = new AtomicInteger(0)
  for (_ <- 0 to 1000) Future {
    counter.getAndIncrement()
    Await.ready(promise.future, Duration.Inf)
  }
  val result = counter.get()
  promise.success(())
  result
}
它是有效的,但我想知道

  • 为什么第一次实施不起作用
  • 如何改进“屏障”实施(例如,摆脱
    isReset
  • ExecutionContext
    中计算线程的最佳方法是什么

例如,尝试向特定的执行者施法

implicit val ec = scala.concurrent.ExecutionContext.Implicits.global
Future(42)
ec.asInstanceOf[java.util.concurrent.ForkJoinPool].getPoolSize // : Int = 1

我相信使用反射或强制转换来访问底层java执行器会更容易,因为它有一个可用的线程getter。我曾经调试过一个奇怪的错误,但是我现在没有了,而且我在手机里,所以我很难再输入一次,但我希望这个建议能有所帮助。看看Scala github中的源代码,这就是我的想法。谢谢。其他问题呢?为什么不先“等待”实施工作?看起来
global
知道
Await.ready
并添加新线程。Michael,因为Await使用托管阻塞通知池需要启动更多线程以避免饥饿。如果您使用了
blocking{…}
@ViktorKlang,同样如此,谢谢。我应该查一下消息来源。在中找到
阻塞
implicit val ec = scala.concurrent.ExecutionContext.Implicits.global
Future(42)
ec.asInstanceOf[java.util.concurrent.ForkJoinPool].getPoolSize // : Int = 1