java - 如何在不阻塞的情况下等待事件发生?

标签 java concurrency akka

我希望我的 Actor 等待某些事件发生,但我希望它仍然接收消息并继续处理消息。我怎样才能实现它?

我的代码如下:

class MyActor extends UntypedActor {
     //onReceive implementation etc...

     private void doSomething(ActorRef other){
         String decision = (String) Await.result(ask(other, new String("getDecision"),1000), Duration.create(1, SECONDS));
         while(decision.equals(""){
              Thread.sleep(100)
              decision = (String) Await.result(ask(other, new String("getDecision"),1000), Duration.create(1, SECONDS));
         }
     }
}

但这会阻止整个参与者,直到它收到正确的决定为止。我怎样才能在不妨碍我的 Actor 的情况下实现类似的目标?

最佳答案

这种代码非常适合使用 Futures

您可以在这里找到更多信息:http://doc.akka.io/docs/akka/snapshot/java/futures.html

就您而言,它看起来像:

final ExecutionContext ec = context().dispatcher();

private void doSomething(ActorRef other){
    Future<Object> decision = (Patterns.ask(other, new String("getDecision"), 1000));
    decision.onSuccess(new OnSuccess<Object>() {
        public void onSuccess(Object result) {
            String resultString = (String) result;
            System.out.println("Decision: " + result);
        }
    }, ec);
}

您应该始终尝试避免 Await.result 正如您所说,这会导致线程阻塞。您可以使用 onSuccessonComplete 等回调在 future 返回后执行代码,而无需等待结果。

关于java - 如何在不阻塞的情况下等待事件发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27748555/

相关文章:

java - VerticalSeekbar 在水平 ScrollView 中工作不流畅

java - 'CompletionStage' 和 'CompletableFuture' 有什么区别

java - 如何将消息从 TimerTask 传递到主线程?

scala - 问超时异常 : on spray-can server stop

java - 在 Android App 中编译 Latex 文档

Java获取资源InvalidJarIndexException

java - 如何在 Scala 中向现有 Java 类添加工厂方法

java - 根据条件定期或仅运行一次 ScheduledExecutorService

scala - 在 Akka 消息中发送 future 可以吗?

scala - 你如何处理 Akka Flow 中的 future ?