我正在使用并行集合,当我的应用程序终止时,sbt问题:
Not interrupting system thread Thread[process reaper,10,system]
每个核心发出一次此消息(确切地减去一个)。
我在sbt代码中看到这是设计的,但我不确定为什么线程不会与我的应用程序一起终止。如果你不幸遇到同样的事情,任何见解都会受到赞赏......
答案 0 :(得分:1)
默认情况下,并行集合由ForkJoinTasks.defaultForkJoinPool
支持,lazy val
,因此在第一次使用时创建它。
与任何ForkJoinPool一样,它会一直运行直到明确关闭。池无法知道它是否会接收任何新任务,并且线程创建相对昂贵,因此当池空闲时关闭它只是为了再次启动它将是浪费新任务被添加。所以它的线程会挂起,除非直到池明确关闭。
作为一个设计决策,JVM不会因为主线程终止而杀死其他线程;在一些编程样式中,主线程相对较早地终止(例如,考虑主线程设置所有内容的Web服务器,启动调度程序线程池,然后退出,但Web服务器继续无限期运行)。
一旦您知道自己不打算进行任何更多的并行操作,就可以致电ForkJoinTasks.defaultForkJoinPool.shutdown()
,或者您可以使用自己的代码明确控制的自定义池创建并行集合。 / p>