浅谈Scala Actor

上篇:Scala语言编码高级特性【下】

Scala Actor

1、概念

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

 


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

(1)Java中的并发编程模型

  • Java中的并发编程基本上满足了事件之间相互独立,但是事件能够同时发生的场景的需要
  • Java中的并发编程是基于共享数据和加锁的一种机制,即会有一个共享的数据,然后有若干个线程 去访问这个共享的数据(主要是对这个共享的数据进行修改),同时Java利用加锁的机制(即synchronized) 来确保同一时间只有一个线程对我们的共享数据进行访问,进而保证共享数据的一致性
  • Java中的并发编程是基于共享数据和加锁的一种机制,即会有一个共享的数据,然后有若干个线程 去访问这个共享的数据(主要是对这个共享的数据进行修改),同时Java利用加锁的机制(即synchronized) 来确保同一时间只有一个线程对我们的共享数据进行访问,进而保证共享数据的一致性

(2)Scala中的并发编程模型

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

(3)Java和Scala的编程模型对比

Java内置线程模型Scala actor模型
“共享数据-锁”模型(share date and lock)share nothing
每一个object有一个monitor,监视多线程共享数据的访问不共享数据,actor之间通过message通讯
加锁代码用syncchronize
死锁问题
每个线程内部都是顺序执行每个actor内部是顺序执行是

对于Java,我们都知道它的多线程实现需要对共享资源(变量、对象等)使用synchronized 关键字进 行代码块同步、对象锁互斥等等。

而且,常常一大块的try…catch语句块中加上wait方法、notify方法、 notifyAll方法是让人很头疼的。原因就在于Java中多数使用的是可变状态的对象资源,对这些资源进行 共享来实现多线程编程的话,控制好资源竞争与防止对象状态被意外修改是非常重要的,而对象状态的 不变性也是较难以保证的。

而在Scala中,我们可以通过复制不可变状态的资源(即对象,Scala中一切 都是对象,连函数、方法也是)的一个副本,再基于Actor的消息发送、接收机制进行并行编程


3、Actor发送消息的方式

!发送异步消息,没有返回值。
!?发送同步消息,等待返回值。
!!发送同步消息,等待返回值。

 


4、Scala Actor实例

package org.apache.scala.day08

//注意导包是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程序就退出了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值