Scala Actor(一):简单入门

来源:互联网 发布:计算机病毒预防和软件 编辑:程序博客网 时间:2024/05/21 07:41

(ps:虽然scala.actors最近被抛弃,但可作为新手入门理解scala的并发编程原理)

原博文地址为:http://blog.csdn.net/yyywyr/article/details/50465411

原文如下:

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

1、Actor初识

[java] view plain copy
 print?
  1. package com.yy.enhance  
  2.   
  3. import scala.actors.Actor  
  4.   
  5. /** 
  6.  * Scala Actor并发编程 
  7.  * 初识Actor 
  8.  */  
  9. object MyActor1 extends Actor{  
  10.   //重新act方法  
  11.   def act(){  
  12.     for(i <- 1 to 10){  
  13.       println("actor1_ " + i)  
  14.       Thread.sleep(2000)  
  15.     }  
  16.   }  
  17. }  
  18.   
  19. object MyActor2 extends Actor{  
  20.   //重新act方法  
  21.   def act(){  
  22.     for(i <- 1 to 10){  
  23.       println("actor2_ " + i)  
  24.       Thread.sleep(2000)  
  25.     }  
  26.   }  
  27. }  
  28.   
  29. object ActorTest extends App {  
  30.     
  31.   //启动Actor  
  32.   MyActor1.start()  
  33.   MyActor2.start()  
  34. }  
结果如下:

[plain] view plain copy
 print?
  1. actor1_ 1  
  2. actor2_ 1  
  3. actor1_ 2  
  4. actor2_ 2  
  5. actor1_ 3  
  6. actor2_ 3  
  7. actor1_ 4  
  8. actor2_ 4  
  9. actor2_ 5  
  10. actor1_ 5  
  11. actor2_ 6  
  12. actor1_ 6  
  13. actor2_ 7  
  14. actor1_ 7  
  15. actor2_ 8  
  16. actor1_ 8  
  17. actor2_ 9  
  18. actor1_ 9  
  19. actor2_ 10  
  20. actor1_ 10  

2、Actor消息传递

[java] view plain copy
 print?
  1. package com.yy.enhance  
  2.   
  3. import scala.actors.Actor  
  4.   
  5. /** 
  6.  * Actor 消息传递 
  7.  *  
  8.  */  
  9. class MyActorForMsg extends Actor{  
  10.   //实现act方法  
  11.   def act(){  
  12.     while(true){  
  13.       //receive从邮箱中获取一条消息  
  14.       //传递给它的函数(如下面case块,执行时转换为一个偏函数)  
  15.       receive{  
  16.         case "my_msg" => println("received the msg:" )  
  17.         case _ => println("Not received the correct msg.")  
  18.       }  
  19.     }  
  20.   }  
  21. }  
  22. object ActorTest2 extends App {  
  23.     
  24.   val actor = new MyActorForMsg()  
  25.   //启动Actor  
  26.   actor.start()  
  27.   //发送消息--正确消息  
  28.   actor!"my_msg"  
  29.    //发送消息--非正确消息  
  30.   actor!"not_my_msg"  
  31. }  
结果如下:

[plain] view plain copy
 print?
  1. received the msg:  
  2. Not received the correct msg.  

3、匿名Actor

      使用scala.actors.Actor._提供的actor工具方法可以方便的创建Actor对象,如下:

[java] view plain copy
 print?
  1. package com.yy.enhance  
  2.   
  3. //提供了actor方法  
  4. import scala.actors.Actor._  
  5. /** 
  6.  * 匿名Actor 
  7.  */  
  8. object ActorTest3 extends App {  
  9.   //创建Actor对象  
  10.   val actor_msg = actor{  
  11.     while(true){  
  12.       receive{  
  13.         case msg => println("Msg from MailBox:" + msg)  
  14.       }  
  15.     }  
  16.   }  
  17.    //创建Actor对象  
  18.    val actor_Int = actor{  
  19.      while(true){  
  20.        receive{  
  21.            case msg:Int => println("the Int Number from MailBox:" + msg)  
  22.            case _ => println("Not a Int Number")  
  23.        }  
  24.      }  
  25.    }  
  26.      
  27.    //发送消息  
  28.    actor_msg!"mmmm"  
  29.    actor_Int!10  
  30.    actor_Int!"22"  
  31. }  
结果如下:

[plain] view plain copy
 print?
  1. the Int Number from MailBox:10  
  2. Not a Int Number  
  3. Msg from MailBox:mmmm  

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

[java] view plain copy
 print?
  1. package com.yy.enhance  
  2.   
  3. import scala.actors.Actor  
  4. import actors._, Actor._  
  5. /** 
  6.  * Actor with Case Class 
  7.  *  
  8.  */  
  9. case class Emp(val name:String, val age:Int)  
  10.   
  11. //Actor  
  12. class MyActor extends Actor{  
  13.   //重写act方法  
  14.   def act(){  
  15.      while(true){  
  16.        receive {  
  17.          case Emp(name,age) =>{  
  18.             println("Emp name:" + name + ",age:" + age)  
  19.             //给消息发送者回复消息  
  20.             sender!"well done,Boy!"  
  21.          }  
  22.        }  
  23.      }  
  24.   }  
  25. }  
  26.   
  27. object ActorWithCaseClassTest  extends App{  
  28.   val myActor = new MyActor  
  29.   //启动  
  30.   myActor.start()  
  31.   //发送消息  
  32.   myActor!Emp("yy",25)  
  33.     
  34.   //接收回传消息  
  35.   self.receive{  
  36.     case msg => println(msg)  
  37.   }  
  38. }  
结果如下:

[plain] view plain copy
 print?
  1. Emp name:yy,age:25  
  2. well done,Boy!  

0 0
原创粉丝点击