我在使用我编写的各种新应用程序时,JVM立即退出,并通过Scala 2.10 Futures + Promises框架生成线程。
似乎至少在默认执行上下文中,即使我使用阻塞,例如
future { blocking { /* work */ }}
没有启动非守护程序线程,因此JVM认为它可以立即退出。
一个愚蠢的工作是启动一个只是等待的虚拟Thread
实例,但是我还需要确保在完成这些过程后该线程停止。
那么如何强制它们在非守护程序线程上运行呢?
答案 0 :(得分:3)
在查看附加到ExecutionContext
的默认ExecutionContext.global
时,它是fork连接类型,它使用的Threadfactory
将线程设置为daemon
。如果您想解决此问题,可以使用其他ExecutionContext
,您自己设置的ExecutionContextImpl
。如果你仍然想要FJP变种(并且你可能会按照它扩展的最佳方式),你应该能够通过这个link查看他们在Executors.newCachedThreadPool
中做了什么,并创建类似的东西。或者只是通过{{1}}使用缓存的线程池,因为在您的期货完成之前不会立即关闭。
答案 1 :(得分:1)
产生过程
如果这意味着进程而不仅仅是任务,那么scala.sys.process会生成非守护进程线程以运行操作系统进程。
否则,如果你正在创建一堆任务,这就是Future.sequence所帮助的。然后在主线程上等待就绪(未来序列列表(期货))。