Scala(六)Actor入门

  1. Actor定义与特点:Scala中的Actor类似于Java里的多线程。”Actor”是一种实现了actor执行体之间使用消息传递进行协作的一直机制,它不”共享任何东西”,也就是说不通的actor并不访问共享的数据结构,这样并发执行就不涉及到任何东西的同步了。
  2. Actor与Java多线程的对比
    1. Java多线程
      1. Java中的多线程编程基本满足了事件之间的相互独立,但是事件能够同时发生的场景也能满足
      2. Java的并发编程是基于共享数据中一种加锁的机智,即会有一个共享的数据,然后若干个线程访问,为了保证数据的一致性,Java多线程利用锁的机制来保证同一时刻只有一个线程能够访问共享数据,进而保证数据的一致性。
      3. Java多线程中存在资源争夺和死锁的情况
    2. Scala多线程
      1. Scala中的多线程编发思想与Java的完全不一样,Scala中的多线程是一种不共享数据,依赖于消息传递的一种并发模式,避免了死锁,资源争夺等情况,再具体的实现中,Scala中的Actor会不断循环自己的有限,并通过receive函数来进行消息的匹配与后续的处理。
      2. 如果Actor A和Actor B相互沟通的话,首先A要给B传递一个消息,B会有一个收件箱,然后B会不断循环自己的收件箱,若发现A发来了消息,B会解析A的消息并执行,处理完成就有可能将处理的结果发送给A
  3. Actor的创建方式

    1. 继承Actor,实现act方法

      package com.lyz.six
      import scala.actors.Actor
      
      object ActorLearn {
        def main(args: Array[String]): Unit = {
          val actor001 = new Actor001 //创建actor对象
          actor001.start() //启动
          actor001.!("liyuzhi") //发送消息
        }
      }
      
      class Actor001 extends Actor {
        def act(): Unit = {
          while (true) {
            receive { //接受消息,利用匹配模式来匹配不同的数据处理请求
              case name: String => println("hello name is " + name)
            }
          }
        }
      }
    2. 两个线程之间进行通信

      package com.lyz.six
      
      import scala.actors.Actor
      
      object ActorLearn1 {
        def main(args: Array[String]): Unit = {
          val actor002 = new Actor002
          val actor003 = new Actor003()
          actor002.start()
          actor003.start()
          actor003.!(Msg("你们开始对话吧", actor002)) //触发Actor003的匹配模式,然后Actor003向Actor002发送消息
      
        }
      }
      
      case class Msg(msg: String, actor: Actor)
      class Actor002 extends Actor {
        def act(): Unit = {
          while (true) {
            receive {
              case Msg(msg, actor) => //这里的actor就是Actor003的引用
                println("你好Actor003,我收到了你的消息是" + msg) //打印接收到的消息
                actor.!(Msg("我是Actor002", this)) //接收到消息以后并向Actor003发送消息,将自己的引用传给对方,对方可以通过匹配到的actor回复消息
            }
          }
        }
      }
      
      class Actor003() extends Actor {
        def act(): Unit = {
          while (true) {
            receive {
              case Msg(msg, actor) => //actor就是通过Msg传入的actor
                println("你好Actor002,我收到了你的消息是" + msg) //打印接收到的消息
                actor.!(Msg("我是Actor003", this)) //接收到消息以后并向Actor002发送消息,将自己的引用传给对方,对方可以通过匹配到的actor回复消息
            }
          }
        }
      }
  4. Actor的同步与Future

    1. 默认情况下,消息是异步的,如果虚妄发送的消息是同步的,即对方响应以后才会继续执行程序,可以使用 !?的方式发送消息。即val reply= actor!? messge
    2. Future:如果要异步发送一个消息,并且在后续需要找个响应值,那么久可以使用Future。即语法为 !!,即val future = actor!!message val reply = future()

猜你喜欢

转载自blog.csdn.net/Suubyy/article/details/80745757