• 第五部分-并发编程模型1:Actor模型


    1.前情提要

    面向对象编程理论中,对象之间通信,依赖的是消息,但java里,对象之间通信,用的是对象方法

    2.Actor模型

    计算模型,计算单位Actor,所有的计算都在Actor中执行
    Actor中一切都是actor,actor之间完全隔离,不共享任何变量

    不共享变量,就不会有并发问题
    java本身不支持actor模型,需要引入第三方类库Akka

    3.代码范例

    
    //该Actor当收到消息message后,
    //会打印Hello message
    static class HelloActor 
        extends UntypedActor {
      @Override
      public void onReceive(Object message) {
        System.out.println("Hello " + message);
      }
    }
    
    public static void main(String[] args) {
      //创建Actor系统
      ActorSystem system = ActorSystem.create("HelloSystem");
      //创建HelloActor
      ActorRef helloActor = 
        system.actorOf(Props.create(HelloActor.class));
      //发送消息给HelloActor
      helloActor.tell("Actor", ActorRef.noSender());
    }
    

    actor之间通信完美遵循了消息机制。而不是通过调用对象的方式

    4.消息和对象方法的区别

    actor内部有一个邮箱mailbox,接受到的消息先放到邮箱,如果有积压,新消息不会马上得到处理。actor是单线程处理消息。所以不会有并发问题

    说白了,就是消费者线程的生产者-消费者模式

    5.区别

    对相关的方法调用,一般是同步的,而actor的消息机制是异步的。

    6.Actor规范定义

    1.处理能力,处理接收到的消息
    2.存储能力,actor可以存储自己的内部状态
    3.通信能力,actor可以和其他actor之间通信
    

    7.actor实现线程安全的累加器

    无锁算法,因为只有1个线程在消费,不会存在并发问题

    
    //累加器
    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();
    }
    

    8.总结

    actor计算模型,基本计算单元。消息通信。

    9.应用

    spark,filink,play

    原创:做时间的朋友
  • 相关阅读:
    Reactive Extensions (Rx) 入门(5) —— Rx的事件编程
    Reactive Extensions (Rx) 入门(4) —— Rx的事件编程
    Reactive Extensions (Rx) 入门(3) —— Rx的事件编程
    Reactive Extensions (Rx) 入门(2) —— 安装 Reactive Extensions
    Reactive Extensions (Rx) 入门(1) —— Reactive Extensions 概要
    Xamarin NuGet 缓存包导致 already added : Landroid/support/annotation/AnimRes 问题解决方案
    Android 系统Action大全
    Xamarin Forms 实现发送通知点击跳转
    如何理解灰度发布
    推荐一款分布式微服务框架 Surging
  • 原文地址:https://www.cnblogs.com/PythonOrg/p/14912970.html
Copyright © 2020-2023  润新知