如何在没有阻塞的情况下等待事件发生?

时间:2015-01-02 21:06:41

标签: java concurrency akka

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

我的代码如下:

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));
         }
     }
}

但这阻止了整个演员,直到它收到正确的决定。如何在不阻挡我的演员的情况下实现这样的目标?

1 个答案:

答案 0 :(得分:2)

这种代码是使用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等回调来在将来返回时执行代码,而无需等待结果。