为什么我的阻塞 Futures 在单核上不 运行?

Why do my blocking Futures not run on single core?

当我 运行 在只有 1 个核心的低功率服务器上执行以下(简化)代码时:

implicit val context: ExecutionContextExecutor = scala.concurrent.ExecutionContext.global

Future(blocking {
  while (true) {
    java.lang.Thread.sleep(1000)
    println("thread 1")
  }
})

while (true) {
  java.lang.Thread.sleep(1000)
  println("main")
}

只有“main”出现在日志中。如果我增加服务器以拥有更多内核,那么它​​就可以工作。我究竟做错了什么?即使内核有限,如何使每个线程 Scala/Java 运行?

我的理解是运行时间应该用一些逻辑让一个线程执行一会儿,然后切换到另一个线程。

scalaVersion := "2.12.12"

经过一番尝试,我发现如果我对我的 EC 使用 ExecutionContext.fromExecutor(Executors.newFixedThreadPool(30)),它就可以工作。所以我对全球 EC & 阻塞的理解一定是错误的。

我无法重现这个问题。即使在单核上,使用 ExecutionContext.global 时也应该至少有一个线程可用,因为默认计算是

numThreads = Runtime.getRuntime.availableProcessors * 1 

等等

Future(blocking {
  while (true) {
    java.lang.Thread.sleep(1000)
    println("thread 1")
  }
})

应该在该线程中执行,而

while (true) {
  java.lang.Thread.sleep(1000)
  println("main")
}

应该在主线程中执行。

请注意,即使只有一个线程可用,如果您一直使用 blocking {},那么新线程仍会产生直到 maxExtraThreads

scala.concurrent.context.maxExtraThreads = defaults to "256"

因此问题可能出在其他地方。