我希望我的演员等待某个事件发生,但我希望它仍然接收消息并继续处理消息。我怎样才能实现它?
我的代码如下:
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));
}
}
}
但这阻止了整个演员,直到它收到正确的决定。如何在不阻挡我的演员的情况下实现这样的目标?
答案 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
,就像你说的那样导致线程阻塞。您可以使用onSuccess
或onComplete
等回调来在将来返回时执行代码,而无需等待结果。