我知道Akka调度程序与全局执行上下文之间的基本区别。
我用scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.ExecutionContext.Implicits.global
val resultF = (0 to 100).map(
x =>
Future {
val startTime = System.currentTimeMillis()
val task = Future {
Thread.sleep(100)
x
}
task.onSuccess {
case result =>
val timeRemaining = System.currentTimeMillis() - startTime
println(s"$result $timeRemaining")
}
}
)
StdIn.readLine()
上面的代码平均打印的时间等于Thread.sleep(),平均约103毫秒。
但是,下面的代码打印时间为100-400毫秒。
val system = ActorSystem("test")
implicit val executionContext = system.dispatcher
val resultF = (0 to 100).map(
x =>
Future {
val startTime = System.currentTimeMillis()
val task = Future {
Thread.sleep(100)
x
}
task.onSuccess {
case result =>
val timeRemaining = System.currentTimeMillis() - startTime
println(s"$result $timeRemaining")
}
}
)
StdIn.readLine()
我无法理解除thread-pool
之外的主要区别是什么。
答案 0 :(得分:0)
我没有理解除了使用线程池之外的主要区别。
唯一的区别是使用的线程池及其工作调度算法。
Akka ActorSystem线程池是一个fork-join执行器,如http://doc.akka.io/docs/akka/2.5/scala/dispatchers.html所述
"全球"默认的ExecutionContext是一个工作窃取线程池,参见例如https://github.com/scala/scala/blob/v2.12.3/src/library/scala/concurrent/ExecutionContext.scala#L135
参见例如How is the fork/join framework better than a thread pool?