为什么学习Actor?
我们现在学的Scala Actor是scala 2.10.x版本及以前版本的Actor。
Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃。
我们学习Actor的目的就是为了学习Akka做铺垫。
什么是Actor?
Actor是消息并发模型。
Scala中的Actor能够实现并行编程的强大功能,它是基于事件模型的并发机制。
Scala是运用消息(message)的发送、接收来实现多线程的。
使用Scala能够更容易地实现多线程应用的开发。
Java并发编程与Scala Actor编程的区别
Scala的Actor类似于Java中的多线程编程。但是不同的是,Scala的Actor提供的模型与多线程有所不同。
Scala的Actor尽可能地避免锁和共享状态,从而避免多线程并发时出现资源争用的情况,进而提升多线程编程的性能。
此外,Scala Actor的这种模型还可以避免死锁等一系列传统多线程编程的问题。
原因就在于Java中多数使用的是可变状态的对象资源,对这些资源进行共享来实现多线程编程的话,
控制好资源竞争与防止对象状态被意外修改是非常重要的,而对象状态的不变性也是较难以保证的。
而在Scala中,我们可以通过复制不可变状态的资源(即对象,Scala中一切都是对象,连函数、方法也是)的一个副本,
再基于Actor的消息发送、接收机制进行并行编程。
Actor方法执行顺序
1.调用start()方法启动Actor
2.执行act()方法
3.向Actor发送消息
发送消息的方式
! --> 发送异步消息,没有返回值。
!? --> 发送同步消息,等待返回值。
!! --> 发送异步消息,返回值是 Future[Any]。
掌握的内容:
1、创建Actor
2、Actor的消息接受和发送
3、用Actor并发编程实现WordCount
ActorDemo.scala
package day05
import scala.actors.Actor
object ActorDemo1 extends Actor{
// 重写act方法
override def act(): Unit = {
for (i <- 1 to 20 ) {
println("actor1:" + i)
Thread.sleep(1000)
}
}
}
object ActorDemo2 extends Actor{
override def act(): Unit = {
for (i <- 1 to 20 ) {
println("actor2:" + i)
Thread.sleep(1000)
}
}
}
object ActorTest {
def main(args: Array[String]): Unit = {
// 启动Actor
ActorDemo1.start()
ActorDemo2.start()
}
}
网友评论