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

时间:2021-02-27 23:11:53

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


核心内容:
1、Scala并发编程匿名Actor、消息传递、偏函数实战解析操作代码实战


1、Scala中并发编程之匿名Actor的创建与实现机制

1>匿名Actor的创建方式:
通过工具方法actor来创建,并通过while(true)不断循环自己的邮箱,然后用receive这个偏函数进行消息的模式匹配并进行处理。
2>Actor的工作机制:在实现的过程中,Actor会不断的循环自己的邮箱,当有消息传递过来的时候,receive这个偏函数就会进行消息的模式匹配
并进行处理。
3>虽然匿名的Actor与实名的Actor工作原理一样,但是Scala当中更倾向于使用匿名的Actor
4>匿名的actor不用实现act方法、不用开启邮箱,邮箱将自动开启,但是有名的actor必须实现act方法、需要开启邮箱,否则邮箱将处于关闭状态。无论是匿名的Actor还是有名的Actor想要邮箱循环的话,必须通过循环的方式.


实例程序1:在scala当中创建匿名的Actor和有名的Actor

//创建有名的Actor
object A extends Actor
{
def act()=
{
while(true) //通过while(true)不断循环自己的邮箱,当有消息传递过来的时候,
{
receive{ //通过偏函数receive进行消息的模式匹配,并进行消息的处理
case msg => println("收件箱中的消息是:" + msg)
}
}
}
}
object App1
{
def main(args:Array[String]):Unit=
{
//创建匿名的Actor---通过scala当中的actor工具方法来创建
val bb = actor //匿名的Actor与实名的Actor工作原理一样
{
while(true)
{
receive{
case msg => println("the message is:"+msg)
}
}
}

A.start() //开辟线程(我理解为邮箱开启)
bb.start() //有无均可
//接下来发送消息
//注意:下面的代码将会同时执行,所谓同时执行就是交替的占用CPU进行执行!
A.!("Spark and Hadoop")
bb.!("Java and Scala" )
A ! "Hbase"
bb ! "Hive"
}
}

运行结果:

the message is:Java and Scala
收件箱中的消息是:Spark and Hadoop
the message is:Hive
收件箱中的消息是:Hbase
2、Scala并发编程之消息传递、偏函数实战解析

1、在scala的模式匹配当中,我们一般用不同的case匹配备选项,如果没有相应case的话,程序就会抛出异常;
Scala中的Actor在实现的过程当中,偏函数receive在进行模式匹配的时候,如果没有相应case的话,程序就不会抛出异常,而是悄悄的忽略
掉这个消息。
2、Actor中偏函数的运行机制:偏函数receiv首先会通过isDefinedAt这个方法判断收件箱中的消息是否符合定义(打算处理),如果是的话,
它才会将这个消息交给我们偏函数的的apply方法进行模式匹配进行处理,如果这个消息不打算处理(false),偏函数receive则会忽略掉这个消息。


实例程序1:

object App3
{
def main(args:Array[String])= //在scala当中,先写参数,后写参数类型
{
val i = readLine()
i match
{
case "Spark" => println("Scala")
case "Hadoop" => println("Java")
//一般情况下,如果没有相应的case,程序就会抛出异常
}
}
}

运行结果:如果没有相应case的话,程序就会抛出异常;

zhang
Exception in thread "main" scala.MatchError: zhang (of class java.lang.String)
at IT05.App3$.main(App3.scala:12)
at IT05.App3.main(App3.scala)

实例程序2:

object App1 
{
def main(args:Array[String]):Unit=
{
//创建匿名的Actor---通过scala当中的actor工具方法来创建
val bb = actor //匿名的Actor与实名的Actor工作原理一样
{
while(true)
{
receive{
case msg:String => println("the message is:"+msg)
case msg:Double => println("the message is:"+msg)
}
}
}

bb ! "Spark"
bb ! 20.0
bb ! 20 //receive偏函数会忽略掉这个消息,并不会抛出异常!
}
}

运行结果:

the message is:Spark
the message is:20.0

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