Scala Actor并发编程

来源:互联网 发布:德语识别算法 编辑:程序博客网 时间:2024/05/21 18:32

    Java中的并发编程主要通过线程实现的,通过共享资源的机制实现并发,但会面临着死锁的问题。在Scala中,是通过消息传递来实现并发的,而Actor正是实现消息传递的。

1、Actor初识

package com.yy.enhanceimport 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_ 1actor2_ 1actor1_ 2actor2_ 2actor1_ 3actor2_ 3actor1_ 4actor2_ 4actor2_ 5actor1_ 5actor2_ 6actor1_ 6actor2_ 7actor1_ 7actor2_ 8actor1_ 8actor2_ 9actor1_ 9actor2_ 10actor1_ 10

2、Actor消息传递

package com.yy.enhanceimport 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:10Not a Int NumberMsg from MailBox:mmmm

4、Actor 和case class 以及消息接收

package com.yy.enhanceimport scala.actors.Actorimport actors._, Actor._/** * Actor with Case Class *  */case class Emp(val name:String, val age:Int)//Actorclass 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:25well done,Boy!


0 0