我正在使用ScalaFutures及其默认的全局上下文和我自己的ExecutionContext。
我很好奇,在执行所有这些操作之后,global context是如何关闭的。因为如果创建自己的ExecutionContext,就必须手动关闭。
例如,
1)使用全局executionContext,
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}
object ParallelTasksWithGlobalExecutionContext {
private val data: Iterable[Input] = Iterable("data1", "data2", "data3")
def main(args: Array[String]): Unit = {
val f: Future[Unit] = Future.traverse(data) { d =>
println(s"[${Thread.currentThread().getName}]-Firing $d")
processData(d)
} map { processed =>
processed.foreach(p => println(s"""[${Thread.currentThread().getName}]-$p"""))
}
Await.result(f, Duration.Inf)
}
type Input = String
type Output = String
def processData: (Input => Future[Output]) = data => {
Future {
Thread.sleep(5000)
s"[Thread-${Thread.currentThread().getName}] data $data is processed."
}
}
}输出
$ sbt "runMain ParallelTasksWithGlobalExecutionContext"
[info] Running ParallelTasksWithGlobalExecutionContext
[run-main-0]-Firing data1
[run-main-0]-Firing data2
[run-main-0]-Firing data3
[scala-execution-context-global-59]-[Thread-scala-execution-context-global-58] data data1 is processed.
[scala-execution-context-global-59]-[Thread-scala-execution-context-global-59] data data2 is processed.
[scala-execution-context-global-59]-[Thread-scala-execution-context-global-60] data data3 is processed.
[success] Total time: 6 s, completed Apr 1, 2018 12:44:36 AM在执行完成后,应用程序将被终止。
2)使用自己的ExecutionContext --在完成所有执行之后,应用程序不会终止,直到我手动执行.shutdown为止。
import java.util.concurrent.Executors
import scala.concurrent.{ExecutionContext, ExecutionContextExecutorService, Future}
import scala.util.{Failure, Success}
object ParallelTasksWithCustomExecutionContext {
private val data: Iterable[Input] = Iterable("data1", "data2", "data3")
implicit val singleThreadContext: ExecutionContextExecutorService = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(3))
def main(args: Array[String]): Unit = {
Future.traverse(data) { d =>
println(s"[${Thread.currentThread().getName}]-Firing $d")
processData(d)
} onComplete {
case Success(processed) =>
processed.foreach(p => println(s"""[${Thread.currentThread().getName}]-$p"""))
//singleThreadContext.shutdown()
case Failure(f) =>
f.printStackTrace()
//singleThreadContext.shutdown()
}
}
type Input = String
type Output = String
def processData: (Input => Future[Output]) = data => {
Future {
Thread.sleep(5000)
s"[Thread-${Thread.currentThread().getName}] data $data is processed."
}
}
}输出
$ sbt "runMain ParallelTasksWithCustomExecutionContext"
[info] Running ParallelTasksWithCustomExecutionContext
[run-main-0]-Firing data1
[run-main-0]-Firing data2
[run-main-0]-Firing data3
[pool-7-thread-1]-[Thread-pool-7-thread-1] data data1 is processed.
[pool-7-thread-1]-[Thread-pool-7-thread-2] data data2 is processed.
[pool-7-thread-1]-[Thread-pool-7-thread-3] data data3 is processed.
<hangs>这是JVisualVM线程监视器,

我的问题是scala的全局上下文是如何在不询问客户端的情况下自动终止的
发布于 2018-04-01 19:56:34
Scala global上下文是使用Thread工厂创建的,这使得Threads守护进程无法阻止它们(线程)在所有用户线程完成它们的执行后退出Threads。
检查ExecutionContextImpl方法def createDefaultExecutorService(reporter: Throwable => Unit): ExecutorService。
https://stackoverflow.com/questions/49594664
复制相似问题