我在使用我编写的各种新应用程序时遇到 JVM 立即退出的问题,这些新应用程序通过 Scala 2.10 Futures + Promises 框架生成线程。
看起来至少在默认执行上下文中,即使我正在使用阻塞,例如
future { blocking { /* work */ }}
没有启动非守护线程,因此 JVM 认为它可以立即退出。
一个愚蠢的解决方法是启动一个虚拟的 Thread
实例,它只是在等待,但是我还需要确保这个线程在进程完成时停止。
那么如何强制它们在非守护线程上运行?
最佳答案
在查看附加到 ExecutionContext.global
的默认 ExecutionContext
时,它属于 fork join 变体,它使用的 Threadfactory
设置线程到 daemon
。如果你想解决这个问题,你可以使用一个不同的 ExecutionContext
,一个你自己设置的。如果您仍然想要 FJP 变体(并且您可能会这样做,因为它的扩展性最好),您应该能够通过此 link 查看它们在 ExecutionContextImpl
中所做的事情。并创建类似的东西。或者只是通过 Executors.newCachedThreadPool
使用缓存线程池,因为它不会在您的 futures 完成之前立即关闭。
关于scala - 没有用于 future 的守护线程的执行上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16612517/