没有守护程序线程的执行上下文

时间:2013-05-17 15:14:47

标签: scala executorservice future

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

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

future { blocking { /* work */ }}

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

一个愚蠢的工作是启动一个只是等待的虚拟Thread实例,但是我还需要确保在完成这些过程后该线程停止。

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

2 个答案:

答案 0 :(得分:3)

在查看附加到ExecutionContext的默认ExecutionContext.global时,它是fork连接类型,它使用的Threadfactory将线程设置为daemon。如果您想解决此问题,可以使用其他ExecutionContext,您自己设置的ExecutionContextImpl。如果你仍然想要FJP变种(并且你可能会按照它扩展的最佳方式),你应该能够通过这个link查看他们在Executors.newCachedThreadPool中做了什么,并创建类似的东西。或者只是通过{{1}}使用缓存的线程池,因为在您的期货完成之前不会立即关闭。

答案 1 :(得分:1)

  

产生过程

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

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