线程模型和AKKA

时间:2015-02-12 20:09:49

标签: akka actor future

我听说默认情况下是一个Actor系统,这意味着它的ExecutorService / Dispatcher正在创建一个非Deamon线程池来运行Actor。如果确实如此,那将解释我所经历的一些行为,在AKKA的文档中我可以找到它。我的意思是在文档的最后一个版本中没有任何说明。它也随之改变了平均时间的变化。

有些人在主线程中使用了AwaitTermination,以防止程序不关闭正在运行的actor系统。我见过这样的代码片段。

但后来我意识到这没用。

仍然通过这种行为拼图我继续试验期货,但它不起作用,我不得不阻止我的主要。但是当在Actor中使用时它可以工作。好吧,因为未来是在一个守护程序线程中运行的。

理解这些差异非常重要。

当一个导入ExecutionContext.implicit.global:

1 - 运行未来时,执行上下文是Deamon或非Deamon Thread的threadPool

2 - 在Actor中运行未来?会发生什么,是否与在actor context.dispatcher中导入相同?在这种情况下,当一个启动Actorsystem时,ExecutionContext.implicit.global值是否会更改为带有非守护程序线程池的executorService。

我真的很感激,如果有人,可以帮助我澄清一点,ExecutionContext.implicit.global的价值在没有演员但是Future的背景下,在Actor的上下文中,以及在Actor中的未来环境中?特别是它管理Deamon或非deamon的哪种线程(关于之前引用的上下文)?如果可能的话,有关它的文档。

1 个答案:

答案 0 :(得分:4)

java.util.concurrent.ThreadFactory创建Deamon或非Deamon类型的线程。

默认情况下ExecutionContext.global使用ForkJoinPool和生成守护程序线程的线程工厂。

在akka配置中,akka.daemonic属性默认为offreference.conf中)。在为默认调度程序和调度程序创建默认线程工厂时使用此标志。

最佳文档是Akka和Scala库的源代码。

我有类似的问题,没有关闭Tomcat容器中的Spray应用程序。使用Java Mission Control,我发现在成功关闭actor系统之后,调度程序线程正在akka.actor.LightArrayRevolverScheduler.waitNanos(long)中休眠。设置akka.daemonic = on解决了这个问题。