Scala并行集合,线程终止和sbt

时间:2014-10-20 07:15:16

标签: scala sbt

我正在使用并行集合,当我的应用程序终止时,sbt问题:

Not interrupting system thread Thread[process reaper,10,system]

每个核心发出一次此消息(确切地减去一个)。

我在sbt代码中看到这是设计的,但我不确定为什么线程不会与我的应用程序一起终止。如果你不幸遇到同样的事情,任何见解都会受到赞赏......

1 个答案:

答案 0 :(得分:1)

默认情况下,并行集合由ForkJoinTasks.defaultForkJoinPool支持,lazy val,因此在第一次使用时创建它。

与任何ForkJoinPool一样,它会一直运行直到明确关闭。池无法知道它是否会接收任何新任务,并且线程创建相对昂贵,因此当池空闲时关闭它只是为了再次启动它将是浪费新任务被添加。所以它的线程会挂起,除非直到池明确关闭。

作为一个设计决策,JVM不会因为主线程终止而杀死其他线程;在一些编程样式中,主线程相对较早地终止(例如,考虑主线程设置所有内容的Web服务器,启动调度程序线程池,然后退出,但Web服务器继续无限期运行)。

一旦您知道自己不打算进行任何更多的并行操作,就可以致电ForkJoinTasks.defaultForkJoinPool.shutdown(),或者您可以使用自己的代码明确控制的自定义池创建并行集合。 / p>