关闭ForkJoinPool会导致程序打印异常并无限期挂起

时间:2014-04-01 23:41:57

标签: java scala concurrency forkjoinpool

我正在使用自定义ExecutionContext作为基于期货的代码,以便每当用户决定中断该程序时,正在进行的任何并发活动在第一次尝试安排另一个时会被中断要处理Future,程序可以退出,而不必等待任何长时间运行的任务完成。

但是,Executor.shutdownNow来电会导致来自第一个java.lang.InterruptedException的{​​{1}}来自sleep(500),但从未到达Await.result,因此也不会来到catch或{ {1}}块;此外,该程序只是无限期挂起。

finally
运行时

(如果重要的话,使用SBT&#39; 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

为什么会这样?

0 个答案:

没有答案