【问题标题】:Scala parallel collections, threads termination, and sbtScala 并行集合、线程终止和 sbt
【发布时间】:2014-10-20 07:15:15
【问题描述】:

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

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

每个核心发出一次此消息(准确地说是减一)。

我在 sbt 代码中看到这是设计使然,但我不确定为什么线程不与我的应用程序一起终止。如果您不幸遇到相同的情况,我们将不胜感激...

【问题讨论】:

  • AFAIK,即使您的 main 方法已经完成,JVM 也会等待任何非守护线程完成。你能分享一些示例代码来复制你描述的行为吗?
  • 是的,我知道,问题是,一般来说,为什么任何线程都会在我的主要方法中存活下来。我确实会尝试提取通用示例代码......直到那时我才想知道什么可以是通用解释

标签: scala sbt


【解决方案1】:

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

与任何ForkJoinPool 一样,它会一直运行直到明确关闭。池无法知道它是否会接收任何新任务,并且线程创建相对昂贵,因此池在它为空时关闭,然后在添加新任务时重新启动,这将是浪费.所以它的线程会一直徘徊,除非并且直到池被明确关闭。

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

一旦您知道您将不再执行任何并行操作,您就可以调用ForkJoinTasks.defaultForkJoinPool.shutdown(),或者您可以使用由您的代码明确控制的自定义池来创建并行集合。

【讨论】:

  • 看来 sbt 只是礼貌地通知它保持这些线程正常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 2013-07-25
  • 2023-03-12
  • 2011-08-02
相关资源
最近更新 更多