我正在使用自定义ExecutionContext
作为基于期货的代码,以便每当用户决定中断该程序时,正在进行的任何并发活动在第一次尝试安排另一个时会被中断要处理Future
,程序可以退出,而不必等待任何长时间运行的任务完成。
但是,Executor.shutdownNow
来电会导致来自第一个java.lang.InterruptedException
的{{1}}来自sleep(500)
,但从未到达Await.result
,因此也不会来到catch
或{ {1}}块;此外,该程序只是无限期挂起。
finally
运行时(如果重要的话,使用SBT' s import scala.concurrent._
import scala.concurrent.forkjoin.ForkJoinPool
object test extends App {
val executor = new ForkJoinPool
implicit val execCtx: ExecutionContext = ExecutionContext.fromExecutor(executor)
try {
Await.result(
for {
_ <- future { blocking { println(1); Thread.sleep(500); println(2) } }
_ = executor.shutdownNow
_ <- future { blocking { println(3); Thread.sleep(500); println(4) } }
} yield (),
duration.Duration.Inf)
} catch { case _: InterruptedException =>
println("CATCH") // not reached
} finally {
println("FINAL") // not reached
executor.shutdown
}
}
),这是输出:
runMain test
为什么会这样?