线程模型和 AKKA

Threading model and AKKA

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

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

但后来我意识到它没有用。

仍然对这种行为感到困惑我继续试验期货,但它没有用,我不得不阻止我的主。但是,当在 Actor 中使用时,它会起作用。那是因为未来 运行 宁在守护线程中。

理解这些差异非常重要。

导入时 ExecutionContext.implicit.global :

1 - 当 运行 未来时,执行上下文是 Deamon 或非 Deamon 线程的线程池

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

如果有人能帮我澄清一下 ExecutionContext.implicit.global 的价值,在只有 Future 没有 actor 的情况下,在 Actor 的情况下,以及在 Actor 的 future 情况下,我将不胜感激?特别是它管理 Deamon 或非 Deamon 的线程类型(关于之前引用的上下文)?如果可能的话,关于它的文档。

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

默认情况下 ExecutionContext.globalForkJoinPool 与生成守护线程的线程工厂一起使用。

在 akka 配置中有 akka.daemonic 属性 默认情况下是 off(在 reference.conf 中)。在为默认调度程序和调度程序创建默认线程工厂时使用此标志。

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

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