【图文详细 】Scala——Actor

版权声明:版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/qq_42246689/article/details/85330449

3、Scala Actor 

3.1、概念 
Scala 中的 Actor 能够实现并行编程的强大功能,它是基于事件模型的并发机制,Scala 是运 用消息(message)的发送、接收来实现多线程的。使用 Scala 能够更容易地实现多线程应 用的开发。 
 
一个 Actor 是一个容器,它包含状态,行为,信箱,子 Actor 和监管策略,所有这些包含在 一个 ActorReference(Actor 引用)里。一个 Actor 需要与外界隔离才能从 Actor 模型中获益, 所以 Actor 是以 Actor 引用的形式展现给外界的。

3.2、传统的 Java 并发编程模型和 Scala Actor 区别 

3.2.1、Java 中的并发编程模型 
1、Java 中的并发编程基本上满足了事件之间相互独立,但是事件能够同时发生的场景的需 要。 
2、Java 中的并发编程是基于共享数据和加锁的一种机制,即会有一个共享的数据,然后有 若干个线程去访问这个共享的数据(主要是对这个共享的数据进行修改),同时 Java 利用加锁 的机制(即 synchronized)来确保同一时间只有一个线程对我们的共享数据进行访问,进而保 证共享数据的一致性。 
3、Java 中的并发编程存在资源争夺和死锁等多种问题,因此程序越大问题越麻烦。 

3.2.2、Scala 中的并发编程模型 
1、Scala 中的并发编程思想与 Java 中的并发编程思想完全不一样,Scala 中的 Actor 是一种不 共享数据,依赖于消息传递的一种并发编程模式,避免了死锁、资源争夺等情况。在具体实 现的过程中,Scala 中的 Actor 会不断的循环自己的邮箱,并通过 receive 偏函数进行消息的 模式匹配并进行相应的处理。 
2、如果 Actor A 和 Actor B 要相互沟通的话,首先 A 要给 B 传递一个消息,B 会有一个收件 箱,然后 B 会不断的循环自己的收件箱,若看见 A 发过来的消息,B 就会解析 A 的消息并执 行,处理完之后就有可能将处理的结果通过邮件的方式发送给 A。

3.2.3、Java 和 Scala 的编程模型对比 

 

对于 Java,我们都知道它的多线程实现需要对共享资源(变量、对象等)使用 synchronized 关键字进行代码块同步、对象锁互斥等等。而且,常常一大块的 try…catch 语句块中加上 wait 方法、notify 方法、notifyAll 方法是让人很头疼的。原因就在于 Java 中多数使用的是可 变状态的对象资源,对这些资源进行共享来实现多线程编程的话,控制好资源竞争与防止对 象状态被意外修改是非常重要的,而对象状态的不变性也是较难以保证的。而在 Scala 中, 我们可以通过复制不可变状态的资源(即对象,Scala 中一切都是对象,连函数、方法也是) 的一个副本,再基于 Actor 的消息发送、接收机制进行并行编程 

3.3、Actor 发送消息的方式 

3.4、Scala Actor 实例 

package com.mazh.scala.actor 
//注意导包是 scala.actors.Actor 
import scala.actors.Actor 
 
object MyActor1 extends Actor{ 
  // 重新 act 方法 
  def act(){ 
    for(i <- 1 to 10){ 
      println ("actor-1 " + i) 
Thread. sleep (2000) 
    } 
  } 
} 
 
object MyActor2 extends Actor{ 
  // 重新 act 方法 
  def act(){ 
    for(i <- 1 to 10){ 
      println ("actor-2 " + i) 
      Thread. sleep (2000) 
    } 
  } 
} 
 
object ActorTest extends App{ 
  // 启动 Actor 
  MyActor1.start() 
  MyActor2.start() 
}

说明:上面分别调用了两个单例对象的 start()方法,他们的 act()方法会被执行,相同与在 Java 中开启了两个线程,线程的 run()方法会被执行 
 
注意:这两个 Actor 是并行执行的,act()方法中的 for 循环执行完成后 actor 程序就退出了 

猜你喜欢

转载自blog.csdn.net/qq_42246689/article/details/85330449