使用期货时程序不会终止
Program not terminating when using Futures
我正在尝试对目录中的每个文件同时 运行 一个函数。可悲的是,每当我使用 Futures 时,我的程序都不想终止(运行s 永远)。我尝试使用 Await.result()
得到相同的结果:/
当 运行ning 代码执行正常时,甚至“完成”?打印出来然后挂起...
这是我的代码。 (我是 Scala 新手)
val execService = Executors.newFixedThreadPool(3)
implicit val execContext = ExecutionContext.fromExecutorService(execService)
val futures = for (file <- filesList) yield Future {
println(file)
// theFunc(file)
}
val seq = Future.sequence(futures)
seq.onComplete {
case Success(x) => println("finish?")
case Failure(e) => println(e)
}
Executors.newFixedThreadPool
在后台使用 defaultThreadFactory
创建非守护线程
Returns a default thread factory used to create new threads. This
factory creates all new threads used by an Executor in the same
ThreadGroup... Each new thread is created as a non-daemon thread
因为这些是非守护线程,所以程序不会终止。另一方面,例如,scala.concurrent.ExecutionContext.Implicits.global
创建 daemon 个线程
val threadFactory = new DefaultThreadFactory(daemonic = true,
maxBlockers = getInt("scala.concurrent.context.maxExtraThreads", "256"),
prefix = "scala-execution-context-global",
uncaught = (thread: Thread, cause: Throwable) => reporter(cause))
我们注意到 daemonic = true
,所以下面的程序将在最后终止
implicit val execContext = scala.concurrent.ExecutionContext.Implicits.global
val futures = for (file <- filesList) yield Future {
println(file)
// theFunc(file)
}
...
基于
我正在尝试对目录中的每个文件同时 运行 一个函数。可悲的是,每当我使用 Futures 时,我的程序都不想终止(运行s 永远)。我尝试使用 Await.result()
得到相同的结果:/
当 运行ning 代码执行正常时,甚至“完成”?打印出来然后挂起...
这是我的代码。 (我是 Scala 新手)
val execService = Executors.newFixedThreadPool(3)
implicit val execContext = ExecutionContext.fromExecutorService(execService)
val futures = for (file <- filesList) yield Future {
println(file)
// theFunc(file)
}
val seq = Future.sequence(futures)
seq.onComplete {
case Success(x) => println("finish?")
case Failure(e) => println(e)
}
Executors.newFixedThreadPool
在后台使用 defaultThreadFactory
创建非守护线程
Returns a default thread factory used to create new threads. This factory creates all new threads used by an Executor in the same ThreadGroup... Each new thread is created as a non-daemon thread
因为这些是非守护线程,所以程序不会终止。另一方面,例如,scala.concurrent.ExecutionContext.Implicits.global
创建 daemon 个线程
val threadFactory = new DefaultThreadFactory(daemonic = true,
maxBlockers = getInt("scala.concurrent.context.maxExtraThreads", "256"),
prefix = "scala-execution-context-global",
uncaught = (thread: Thread, cause: Throwable) => reporter(cause))
我们注意到 daemonic = true
,所以下面的程序将在最后终止
implicit val execContext = scala.concurrent.ExecutionContext.Implicits.global
val futures = for (file <- filesList) yield Future {
println(file)
// theFunc(file)
}
...
基于