(ps:虽然scala.actors最近被抛弃,但可作为新手入门理解scala的并发编程原理)
原博文地址为:http://blog.youkuaiyun.com/yyywyr/article/details/50465411
原文如下:
Java中的并发编程主要通过线程实现的,通过共享资源的机制实现并发,但会面临着死锁的问题。在Scala中,是通过消息传递来实现并发的,而Actor正是实现消息传递的。
1、Actor初识
- package com.yy.enhance
- import scala.actors.Actor
- /**
- * Scala Actor并发编程
- * 初识Actor
- */
- object MyActor1 extends Actor{
- //重新act方法
- def act(){
- for(i <- 1 to 10){
- println("actor1_ " + i)
- Thread.sleep(2000)
- }
- }
- }
- object MyActor2 extends Actor{
- //重新act方法
- def act(){
- for(i <- 1 to 10){
- println("actor2_ " + i)
- Thread.sleep(2000)
- }
- }
- }
- object ActorTest extends App {
- //启动Actor
- MyActor1.start()
- MyActor2.start()
- }
- actor1_ 1
- actor2_ 1
- actor1_ 2
- actor2_ 2
- actor1_ 3
- actor2_ 3
- actor1_ 4
- actor2_ 4
- actor2_ 5
- actor1_ 5
- actor2_ 6
- actor1_ 6
- actor2_ 7
- actor1_ 7
- actor2_ 8
- actor1_ 8
- actor2_ 9
- actor1_ 9
- actor2_ 10
- actor1_ 10
2、Actor消息传递
- package com.yy.enhance
- import scala.actors.Actor
- /**
- * Actor 消息传递
- *
- */
- class MyActorForMsg extends Actor{
- //实现act方法
- def act(){
- while(true){
- //receive从邮箱中获取一条消息
- //传递给它的函数(如下面case块,执行时转换为一个偏函数)
- receive{
- case "my_msg" => println("received the msg:" )
- case _ => println("Not received the correct msg.")
- }
- }
- }
- }
- object ActorTest2 extends App {
- val actor = new MyActorForMsg()
- //启动Actor
- actor.start()
- //发送消息--正确消息
- actor!"my_msg"
- //发送消息--非正确消息
- actor!"not_my_msg"
- }
- received the msg:
- Not received the correct msg.
3、匿名Actor
使用scala.actors.Actor._提供的actor工具方法可以方便的创建Actor对象,如下:
- package com.yy.enhance
- //提供了actor方法
- import scala.actors.Actor._
- /**
- * 匿名Actor
- */
- object ActorTest3 extends App {
- //创建Actor对象
- val actor_msg = actor{
- while(true){
- receive{
- case msg => println("Msg from MailBox:" + msg)
- }
- }
- }
- //创建Actor对象
- val actor_Int = actor{
- while(true){
- receive{
- case msg:Int => println("the Int Number from MailBox:" + msg)
- case _ => println("Not a Int Number")
- }
- }
- }
- //发送消息
- actor_msg!"mmmm"
- actor_Int!10
- actor_Int!"22"
- }
- the Int Number from MailBox:10
- Not a Int Number
- Msg from MailBox:mmmm
4、Actor 和case class 以及消息接收
- package com.yy.enhance
- import scala.actors.Actor
- import actors._, Actor._
- /**
- * Actor with Case Class
- *
- */
- case class Emp(val name:String, val age:Int)
- //Actor
- class MyActor extends Actor{
- //重写act方法
- def act(){
- while(true){
- receive {
- case Emp(name,age) =>{
- println("Emp name:" + name + ",age:" + age)
- //给消息发送者回复消息
- sender!"well done,Boy!"
- }
- }
- }
- }
- }
- object ActorWithCaseClassTest extends App{
- val myActor = new MyActor
- //启动
- myActor.start()
- //发送消息
- myActor!Emp("yy",25)
- //接收回传消息
- self.receive{
- case msg => println(msg)
- }
- }
- Emp name:yy,age:25
- well done,Boy!
本文介绍了 Scala 中 Actor 模型的基本概念与使用方法,包括 Actor 的创建与启动、消息传递、匿名 Actor 和使用 case class 进行消息接收。
1095

被折叠的 条评论
为什么被折叠?



