大数据系列修炼-Scala课程69

来源:互联网 发布:帝国cms小说 编辑:程序博客网 时间:2024/05/21 14:57

大数据系列修炼-Scala课程69


核心内容:
1、Scala并发编程之react、loop的相关用法操作代码实战


1、Scala并发编程之react、loop操作代码实战

1>在Java当中,所谓执行一个线程,就是执行本线程所对应的run方法,若run方法里面的代码执行完毕,这个线程就会结束,此时线程默认就会得到回收(销毁),因此为了使线程得到重用,即不被销毁、回收,我们常常将run方法里面的代码块加上一个循环。
2>所谓线程重用就是一个线程执行完毕之后,这个线程并没有立即被销毁、回收,而是可以继续被使用。
3>在Java当中,线程重用的具体方式是run方法里面的代码加上循环,在Scala当中,线程重用的方式就是Actor通过while(true)或者loop循环不断的关联自己的邮箱,使自己的邮箱不断的处于循环状态。
4>在scala当中,使用react与loop的方式使线程得到重用。
5>在scala当中,receive方法通过while(true)或loop循环实现线程的重用,不断的关联自己的邮箱;react方法通过再次调用act方法或
者loop循环(while(true)不行)实现线程的重用,具体表现为通过act()方法可以重新关联Actor的邮箱。
6>loop可以循环调用react或者receive来处理邮箱中的信息,通过loop方法,可以简化react方法的调用
7>react偏函数通过模式匹配处理完一条消息之后会导致act方法自身的退出,进而导致线程注销,通过调用act()方法可以重
新关联Actor的邮箱


实例程序1:Java当中常用while(true)方式使线程得到重用–即为run方法里面的代码块加上一个循环。

class A extends Thread{   public void run()  //所谓执行一个线程,就是执行本线程所对应的run方法   {       while(true)       {           for(int i=0;i<10;i++)           {               System.out.println("Step:"+i);               try               {                Thread.sleep(500);               } catch (Exception e) {}           }         }   }}class App1{    public static void main(String[] args)    {        A  aa = new A();        aa.start();//向下开辟一个新的线程,并执行本线程所对应的run方法    }}

运行结果:下面的代码将不断的进行循环,防止线程死掉

Step:0Step:1Step:2Step:3Step:4Step:5Step:6Step:7Step:8Step:9

实例程序2:receive方法通过while(true)或loop循环实现线程的重用

case class B(name:String,score:Double)class A extends Actor{   def act()=   {     while(true)  //receive通过while(true)不断循环自己的邮箱     {       receive       {         case msg:String => println("String is:" + msg)         case msg:Double => println("Double is:" + msg)         case B(name,score) => println(name + "\t" + score)         case _ => println("Nothing!")       }     }   }}object App1 {   def main(args:Array[String]):Unit=   {         val aa = new A()       aa.start()       aa ! 20.0       aa ! "Spark"       aa ! new B("Hadoop",89)   }}

运行结果:

Double is:20.0String is:SparkHadoop  89.0

如果上面的程序没有while(true),则运行结果为:

Double is:20.0

实例程序3:react方法通过再次调用act方法或者loop循环(while(true)不行)实现线程的重用

case class B(name:String,score:Double)class A extends Actor{   def act()=   {       react  //不断的调用act方法才能实现邮箱的重复运作       {         case msg:String => println("String is:" + msg)         act()         case msg:Double => println("Double is:" + msg)         act()         case B(name,score) => println(name + "\t" + score)         act()         case _ => println("Nothing!")         act()       }   }}object App1 {   def main(args:Array[String]):Unit=   {         val aa = new A()       aa.start()       aa ! 20.0       aa ! "Spark"       aa ! new B("Hadoop",89)   }}

实例程序4:通过loop方法,可以简化react方法的调用

case class B(name:String,score:Double)class A extends Actor{   def act()=   {     loop //receive通过while(true)不断循环自己的邮箱     {       react       {         case msg:String => println("String is:" + msg)         case msg:Double => println("Double is:" + msg)         case B(name,score) => println(name + "\t" + score)         case _ => println("Nothing!")       }     }   }}object App1 {   def main(args:Array[String]):Unit=   {         val aa = new A()       aa.start()       aa ! 20.0       aa ! "Spark"       aa ! new B("Hadoop",89)   }}

如有问题,欢迎留言指正!

0 0