Multithreading scala cann的未来';当未来数大于cpu核心数时,不能异步运行

Multithreading scala cann的未来';当未来数大于cpu核心数时,不能异步运行,multithreading,scala,future,blocking,Multithreading,Scala,Future,Blocking,我用Future用scala语言实现了一个多线程函数。但当未来的线程数大于cpu核心数时,线程被分成多个组。一个组中的线程完成,然后其他组中的其他线程开始。下面列出了我的代码和输出。我的代码中是否有错误,如何修复 进程已完成,退出代码为0。您可以创建自己的执行上下文 import java.util.concurrent.Executors import scala.concurrent.ExecutionContext object CustomExecutionContext { p

我用Future用scala语言实现了一个多线程函数。但当未来的线程数大于cpu核心数时,线程被分成多个组。一个组中的线程完成,然后其他组中的其他线程开始。下面列出了我的代码和输出。我的代码中是否有错误,如何修复



进程已完成,退出代码为0。您可以创建自己的执行上下文

import java.util.concurrent.Executors
import scala.concurrent.ExecutionContext

object CustomExecutionContext {
  private val availableProcessors = Runtime.getRuntime.availableProcessors()

  implicit val nDExecutionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(availableProcessors * N)) // N is number of threads
}
implicit val ec = ThrottledExecutionContext(maxConcurrents = 4)(scala.concurrent.ExecutionContext.global)
另一个解决方案:使用
FixedThreadPool
控制未来并行执行的次数。它将首先启动10个期货,然后在完成这些后启动其他期货

implicit val ec = ExecutionContext.fromExecutor(java.util.concurrent.Executors.newFixedThreadPool(10))
第三种解决方案:您可以使用节流执行上下文

使用此上下文而不是全局执行上下文

import java.util.concurrent.Executors
import scala.concurrent.ExecutionContext

object CustomExecutionContext {
  private val availableProcessors = Runtime.getRuntime.availableProcessors()

  implicit val nDExecutionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(availableProcessors * N)) // N is number of threads
}
implicit val ec = ThrottledExecutionContext(maxConcurrents = 4)(scala.concurrent.ExecutionContext.global)
这将限制并行性


第四种解决方案:您可以使用
akka fsm
来调节油门

这是
ExecutionContext.Implicits.global
的预期行为。如果您想更改它,您需要使用符合您需求的相应执行上下文。您没有指定所需的行为,那么我们如何才能说“如何修复它?”特别有趣的是,如果
线程
被设置为
10000