那么Actor可以看为一个状态机,状态的变化基于上一个状态,并根据上一个状态来决定处理下一条状态
而且其中使用的是单线程处理,不存在竞态条件
下面用其去实现一个累加器,如果传入的是一个数值,则会进行累加,其他类型则会进行打印累加的值,并且开启了多个线程来进行累加,整个程序没有锁,来验证其是具有线程安全
//累加器
static class CounterActor extends UntypedActor {
private int counter = 0;
@Override
public void onReceive(Object message){
//如果接收到的消息是数字类型,执行累加操作,
//否则打印counter的值
if (message instanceof Number) {
counter += ((Number) message).intValue();
} else {
System.out.println(counter);
}
}
}
public static void main(String[] args) throws InterruptedException {
//创建Actor系统
ActorSystem system = ActorSystem.create(“HelloSystem”);
//4个线程生产消息
ExecutorService es = Executors.newFixedThreadPool(4);
//创建CounterActor
ActorRef counterActor = system.actorOf(Props.create(CounterActor.class));
//生产4*100000个消息
for (int i=0; i<4; i++) {
es.execute(()->{
for (int j=0; j< 100000; j++) {
counterActor.tell(1, ActorRef.noSender());
}
});
}
//关闭线程池
es.shutdown();
//等待CounterActor处理完所有消息
Thread.sleep(1000);
//打印结果
counterActor.tell(“”, ActorRef.noSender());
//关闭Actor系统
system.shutdown();
}
Acotr这个模型非常适合并发问题的解决,之间通过消息进行通信,,彼此的对象匹配度非常高,在面向对象语言中使用Actor非常合适
在Actor中,可以使用Actor来创建新的Actor,最终是一个树状结构,但是现在的实现并不完美,仍然存在消息发出并没有被接收到的问题