Akka的Actor和Java8 CompletableFuture可以安全地组合在一起吗?



就我对Akka文档的理解而言,Akka ActorSystem包含自己的线程池来执行参与者。我在一个Java应用程序中使用Akka,该应用程序也使用Java8期货;后者由ForkJoinPool.commonPool()执行。因此,参与者和期货使用不同的池,这可能会挫败隐藏在两个调度器中的某些假设(例如,Akka调度器可能会假设期货在Akka池上运行)。这会造成性能问题吗?

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

当然,在将Actors与Java8Futures结合时,您必须遵守所有相同的注意事项,这些注意事项也适用于Scala Futures,请参阅文档。特别是,永远不要在Future任务或回调中触摸Actor的任何内容(没有字段,没有方法)。只有ActorRef是安全的。

最新更新