使用Java 手写一个简单的actor模型-只记录数据的

  • 作者: 凯哥Java(公众号:凯哥Java)
  • Actor模型及Akka
  • 时间:2023-05-06 13:56
  • 3149人已阅读
简介 首先定义一个Actor接口,包含三个方法:onStart、onMessage和onStop。onStart方法在Actor启动时调用一次,onMessage方法在Actor接收到消息时调用,onStop方法在Actor停止时调用:public interface Actor<T> {    void onS

🔔🔔🔔好消息!好消息!🔔🔔🔔

有需要的朋友👉:联系凯哥 微信号 kaigejava2022

首先定义一个 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 等,来实现更复杂的应用。

TopTop