那么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,最终是一个树状结构,但是现在的实现并不完美,仍然存在消息发出并没有被接收到的问题

发表评论

邮箱地址不会被公开。 必填项已用*标注