【问题标题】:Execution context without daemon threads for futures没有用于期货的守护线程的执行上下文
【发布时间】:2013-05-12 19:50:45
【问题描述】:

我在使用我编写的各种新应用程序立即退出 JVM 时遇到问题,这些应用程序通过 Scala 2.10 Futures + Promises 框架生成线程。

似乎至少使用默认执行上下文,即使我使用阻塞,例如

future { blocking { /* work */ }}

没有启动非守护线程,因此 JVM 认为它可以立即退出。

一个愚蠢的解决方法是启动一个正在等待的虚拟 Thread 实例,但我还需要确保该线程在进程完成时停止。

那么我如何强制它们在非守护线程上运行?

【问题讨论】:

  • 你在用什么ExecutionContext?您是自己创建的还是从ExecutionContext.global 获取的?
  • 我认为global 和实例化单线程线程都会发生这种情况,这基本上是我的两种情况。

标签: scala executorservice future


【解决方案1】:

在查看附加到ExecutionContext.global 的默认ExecutionContext 时,它属于fork join 类型,它使用的Threadfactory 将线程设置为daemon。如果你想解决这个问题,你可以使用一个不同的ExecutionContext,一个你自己设置的。如果您仍然想要 FJP 品种(并且您可能会这样做,因为它的规模最好),您应该能够通过 link 查看他们在 ExecutionContextImpl 中所做的事情并创建类似的东西。或者只是通过Executors.newCachedThreadPool 使用缓存线程池,因为它不会在您的未来完成之前立即关闭。

【讨论】:

  • private[scala], grmpff。但无论如何感谢链接,并确认他们将 daemon 设置为 true(没有任何配置的可能性,该死的......)
【解决方案2】:

生成进程

如果这意味着进程而不仅仅是任务,那么 scala.sys.process 会生成非守护线程来运行 OS 进程。

否则,如果您要创建一堆任务,这就是 Future.sequence 的帮助。然后在主线程上等待就绪(未来序列列表(期货))。

【讨论】:

  • 抱歉措辞错误。不,我在我的进程中运行计算。所以,从技术上讲,线程。
猜你喜欢
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 2019-05-01
  • 1970-01-01
相关资源
最近更新 更多