使用Java 手写一个简单的actor模型-只记录数据的
- Actor模型及Akka
- 时间:2023-05-06 13:56
- 3807人已阅读
简介
首先定义一个Actor接口,包含三个方法:onStart、onMessage和onStop。onStart方法在Actor启动时调用一次,onMessage方法在Actor接收到消息时调用,onStop方法在Actor停止时调用:public interface Actor<T> { void onS
🔔🔔好消息!好消息!🔔🔔
有需要的朋友👉:微信号
首先定义一个 Actor 接口,包含三个方法:onStart、onMessage 和 onStop。onStart 方法在 Actor 启动时调用一次,onMessage 方法在 Actor 接收到消息时调用,onStop 方法在 Actor 停止时调用:
public interface Actor<T> {
void onStart();
void onMessage(T message);
void onStop();
}接下来实现一个简单的 ActorSystem 类,负责创建和管理 Actor。它包括一个名为 actors 的 Map,用于存储所有 Actor 实例:
import java.util.HashMap;
import java.util.Map;
public class ActorSystem {
private Map<String, Actor<?>> actors = new HashMap<>();
public <T> ActorRef<T> actorOf(Actor<T> actor, String name) {
// 创建 ActorRef,并将 Actor 加入 actors 中
ActorRef<T> actorRef = new ActorRef<>(actor, name);
actors.put(name, actor);
return actorRef;
}
public void stop(Actor<?> actor) {
actor.onStop();
actors.remove(actor);
}
}ActorRef 是 Actor 的一个代理,它包装了 Actor 实例和 Actor 名称。通过 ActorRef,我们可以发送消息到 Actor。
public class ActorRef<T> {
private Actor<T> actor;
private String name;
public ActorRef(Actor<T> actor, String name) {
this.actor = actor;
this.name = name;
}
public void send(T message) {
actor.onMessage(message);
}
public String getName() {
return name;
}
}最后,定义几个具体的 Actor 实现,例如一个简单的 CounterActor,用于计数收到的消息数量:
public class CounterActor implements Actor<Integer> {
private int count = 0;
@Override
public void onStart() {
System.out.println("CounterActor started");
}
@Override
public void onMessage(Integer message) {
count += message;
System.out.println("CounterActor received message: " + message + ", total count: " + count);
}
@Override
public void onStop() {
System.out.println("CounterActor stopped");
}
}使用示例,创建一个 ActorSystem,创建一个 CounterActor,将它的 ActorRef 添加到 ActorSystem 中,然后向 CounterActor 发送两个消息:
public class Main {
public static void main(String[] args) {
ActorSystem system = new ActorSystem();
CounterActor counterActor = new CounterActor();
ActorRef<Integer> counterRef = system.actorOf(counterActor, "counter");
counterRef.send(1);
counterRef.send(2);
system.stop(counterActor);
}
}执行上述程序后,将会输出:
CounterActor started CounterActor received message: 1, total count: 1 CounterActor received message: 2, total count: 3 CounterActor stopped
以上就是一个简单的 Java Actor 模型的实现。实现起来很简单,但是 Actor 模型很强大,可以用来实现高并发、分布式系统等。同时也可以结合其他框架,如 Akka 等,来实现更复杂的应用。