Akka actor 和 Java8 CompletableFuture 可以安全地组合吗?

Can Akka actors and Java8 CompletableFuture's be safely combined?

据我了解 Akka 文档,Akka ActorSystem 包含自己的线程池来执行 actors。我在 Java 应用程序中使用 Akka,该应用程序也使用 Java8 期货;后者由 ForkJoinPool.commonPool() 执行。因此,actor 和 futures 使用不同的池,这可能会推翻隐藏在两个调度程序中的某些假设(例如,Akka 调度程序可能假设 futures 在 Akka 池中 运行)。这会造成任何性能问题吗?

关于 Actors 和 Futures 的执行没有隐藏的假设:我们提供的唯一保证是任何给定的 Actor 在任何给定时间最多只在一个线程上执行。 Futures 没有遵守这样的限制,只要 ExecutionContext(或 ThreadPool)决定 运行 它们,它们就会 运行。

在将 Actors 与同样适用于 Scala Futures 的 Java8 Futures 组合时,您当然必须遵守所有相同的注意事项,请参阅 the docs。特别是,永远不要在 Future 任务或回调中接触 Actor 的任何东西(没有字段,没有方法)。只有 ActorRef 是安全的。