gpt4 book ai didi

Java Akka 的 ActorRef 异步问题

转载 作者:行者123 更新时间:2023-12-01 09:51:40 25 4
gpt4 key购买 nike

我已经开始使用 Akka 与并发程序进行异步:

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.actor.UntypedActor;

public class TestAkka {

public static void main(String[] args) throws InterruptedException {
ActorSystem as1 = ActorSystem.create("actor1");
ActorRef ar1 = as1.actorOf(Props.create(Hello.class));
System.out.println("Start to say hello!");
ar1.tell("Bob", ActorRef.noSender());
ar1.tell("John", ActorRef.noSender());
System.out.println("Finish to say hello!");
}

public static class Hello extends UntypedActor {

@Override
public void onReceive(Object message) throws Exception {
if (message instanceof String) {
System.out.println("Hello " + message);
Thread.sleep(10000); // <--Sim the job take a short time
}
}
}
}

我执行上面的程序,系统必须一一完成(非并发):

ar1.tell("Bob", ActorRef.noSender());
ar1.tell("John", ActorRef.noSender());

所以结果是:

Hello Bob
(Wait 5 seconds)
Hello John
(Wait 5 seconds)

我想让它们并发,如何处理?我希望 Akka 应该自动处理它:) 谢谢你的想法!

最佳答案

Akka(以及一般的 Actor 模型)的原理是,在单个 Actor 中,一切都按顺序发生。这有几个优点,包括参与者在处理自己的可变状态时可以是无锁的。并发是通过多个参与者同时运行来实现的。

因此,如果您创建两个 Hello actor 并向它们每个发送一条消息,它们将同时处理它们。 (假设你的 akka 执行上下文有足够的线程)。

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.actor.UntypedActor;

public class TestAkka {

public static void main(String[] args) throws InterruptedException {
ActorSystem as1 = ActorSystem.create("actor1");
ActorRef ar1 = as1.actorOf(Props.create(Hello.class));
ActorRef ar2 = as1.actorOf(Props.create(Hello.class));
System.out.println("Start to say hello!");
ar1.tell("Bob", ActorRef.noSender());
ar2.tell("John", ActorRef.noSender());
System.out.println("Finish to say hello!");
}

public static class Hello extends UntypedActor {

@Override
public void onReceive(Object message) throws Exception {
if (message instanceof String) {
System.out.println("Hello " + message);
Thread.sleep(10000); // <--Sim the job take a short time
}
}
}
}

关于Java Akka 的 ActorRef 异步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37558635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com