akka 由< Terminated>ActorSystem.terminate()返回的Future与由ActorSystem.whenTerminated()返回的Future之间有什么区别吗?

35g0bw71  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(145)

我的java应用程序使用Akka框架进行消息路由。在应用程序启动时,我创建Actor System,然后创建一些顶级Actor。现在,在关闭应用程序时,我调用Await.result(参与者系统终止(),Duration.Inf()),并希望我关闭线程等待,直到演员系统终止。我遇到了其他API ActorSystem.whenTerminated()也返回Future并执行类似的操作..只是想知道这两个API之间的区别吗?我应该使用ActorSystem.whenTerminated()吗?

y1aodyip

y1aodyip1#

ActorSystem.terminate()返回的future实际上是ActorSystem.whenTerminated(),这在源代码中可以看到,唯一的区别是whenTerminated给你一个future,它告诉你何时结束,而terminate实际上开始了结束的过程。
所以在一个试图阻止演员系统的过程中,在以下两种情况之间并没有真正的区别:

scala.compat.java8.FutureConverters.toJava(actorSystem.terminate())
    .thenAccept(t -> System.out.println(t))
    .join();

actorSystem.terminate();
actorSystem.getWhenTerminated()
    .thenAccept(t -> System.out.println(t))
    .join();

然而,在一些情况下,

actorSystem.getWhenTerminated()
    .thenAccept(t -> System.out.println(t))
    .join();

可以是系统中相对于terminate调用的任何其他位置(例如,在main中)。

相关问题