3

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

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

future { blocking { /* work */ }}

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

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

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

4

2 回答 2

4

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

于 2013-05-17T15:26:36.393 回答
1

产生过程

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

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

于 2013-05-17T18:31:29.357 回答