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!