Scala并发编程【进阶】
package com.dingxin.entrance import java.text.SimpleDateFormat
import java.util.Date import scala.actors.Actor
import scala.actors.Actor._
/**
* Created by zhen on 2019/1/24.
*/
object My_Actor_Receive extends Actor{
def act(){
while(true){
receive{
case str : String => print(str + " ") // 模式匹配
case dat : Date => println(new SimpleDateFormat("yyyy").format(dat))
case _ => println("My heart will go on !")
}
}
}
}
object Actor_Receive {
def main(args: Array[String]) {
val getMessage = actor{
while(true){
receive{
case str : String => print(str) // 模式匹配
case dat : Date => println(new SimpleDateFormat("yyyy").format(dat))
case _ => My_Actor_Receive ! null // 消息转发
}
}
}
val sendMessage = actor{
while(true){
receive{
case str : String => getMessage ! str + " " // 消息转发
case dat : Date => getMessage ! dat
case _ => getMessage ! null
}
}
}
sendMessage ! "Scala"
sendMessage ! new Date()
sendMessage ! 2020 // 这种方式必须执行start开启,且都是并行执行,不确定先后顺序
My_Actor_Receive.start()
My_Actor_Receive ! "Spark"
}
}
结果1:

结果2:

信息交互
package big.data.analyse.scala import scala.actors.Actor
import scala.actors.Actor._
/**
* 消息发送与接收,可用于流计算测试的输入
* Created by zhen on 2018/4/15.
*/
object ActorTest {
def main(args: Array[String]) {
val actor = new HelloActor
actor.start//启动actor消息机制
var counter = 0
while(counter<10){
actor ! "Step " + counter //发送消息
counter += 1
Thread.sleep(2000)
self.receive{case msg => println("返回结果:"+msg)} // 获取子线程的消息
}
}
}
class HelloActor extends Actor{
def act(): Unit ={
while(true){
receive{
case content : String => println("Message : " + content)
sender ! content.split(" ")(1) // 向主线程发送消息
}
}
}
}
结果3:

loop+react
package big.data.analyse.scala.actor
import java.net.{UnknownHostException, InetAddress}
import scala.actors.Actor
import scala.actors.Actor._
/**
* Created by zhen on 2019/6/19.
*/
object NameResolver extends Actor{
def act(){
loop {
react {
case Net (name, actor) => actor ! getIp(name)
case msg => println("Unhandled message : " + msg)
}
}
}
def getIp(name : String) : Option[InetAddress] = {
try{
println(name)
Some(InetAddress.getByName(name))
} catch {
case _ : UnknownHostException => None
}
}
}
case class Net(name : String, actor: Actor)
object Actor_More_Effective {
def main(args: Array[String]) {
NameResolver.start
NameResolver ! Net("www.baidu.com", self)
NameResolver ! "www.xiaomi.com"
for(i <- 1 until 10){
NameResolver ! "小米" + i
}
println(self.receiveWithin(1000){case x => x})
}
}
结果4:

Actor详解
1.Actor是一个通信模型,Scala提供了Actor的实现
2.Spark1.6之前集群节点之间通信使用的是Akka,Akka底层是Actor实现的。Spark1.6之后,节点的通信变成Netty
3.Actor相当于我们理解的Thread,Actor的出现主要解决的是代码锁的问题
4.Actor底层通信实现用到了模式匹配
Scala并发编程【进阶】的更多相关文章
- Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- Scala 深入浅出实战经典 第67讲:Scala并发编程匿名Actor、消息传递、偏函数解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala 深入浅出实战经典 第66讲:Scala并发编程实战初体验
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala并发编程react、loop代码实战具体解释
演示样例代码及凝视: //scala并发编程中的react和loop,共同特点: //通过线程存用的方式让性能有所提升. //Actor本身的运行,被actor子系统管理的时候,会有一个或者多个远程的 ...
- Scala并发编程【快速入门】
1.简介 Scala的actor提供了一种基于事件的轻量级线程.只要使用scala.actors.Actor伴生对象的actor()方法,就可以创建一个actor.它接受一个函数值/闭包做参数,一创建 ...
- 王家林系列之scala--第69讲:Scala并发编程react、loop代码实战详解
刚才看了一下,群里王家林老师又更新课程了,真为王老师的勤奋感到佩服,于是迫不及待的下载下来观看学习.本期讲的是关于scala并发编程的react.loop代码实战. 信息来源于 DT大数据梦工厂微信公 ...
- Scala函数式编程进阶
package com.dtspark.scala.basics /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式 ...
- Scala并发编程
Scala的actor提供了一种基于事件的轻量级线程.只要使用scala.actors.Actor伴生对象的actor方法,就可以创建一个actor.它接受一个函数值/闭包做参数,一创建好就开始运行. ...
- Scala并发编程模型AKKA
一.并发编程模型AKKA Spark使用底层通信框架AKKA 分布式 master worker hadoop使用的是rpc 1)akka简介 写并发程序很难,AKKA解决spark这个问题. akk ...
- Scala实战高手****第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
/** * 函数式编程进阶: * 1.函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量 * 2.函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称 ...
随机推荐
- two's complement,2的补码
本文为作者原创,允许转载,但必须注明原文地址:https://www.cnblogs.com/byronxie/p/10117265.html Let's start with one questio ...
- 【EF6学习笔记】(五)数据库迁移及部署
原文地址:Code First Migrations and Deployment 原文主要讲两部分:开发环境下数据库迁移到其他数据库服务器:以及在Azure上如何部署应用: 迁移数据库 原文前面讲一 ...
- RocketMQ源码 — 四、 Consumer 接收消息过程
Consumer consumer pull message 订阅 在Consumer启动之前先将自己放到一个本地的集合中,再以后获取消费者的时候会用到,同时会将自己订阅的信息告诉broker 接收消 ...
- MFC控件编程之鼠标跟键盘消息
MFC控件编程之鼠标跟键盘消息 在MFC中鼠标消息.键盘消息我们很常用.所以说一下. 鼠标消息分为客户区消息.跟非客户区消息. 一丶客户区消息 我们可以处理消息.来进行我们相应的函数即可. MFC添加 ...
- 逆向知识第一讲,IDA的熟悉使用
逆向知识第一讲,IDA的熟悉使用 一丶熟悉IDA,以及手工制作sig文件. IDA,静态分析工具,网上随便找一个即可下载. 首先,我们写一个可执行EXE,最简单的 使用IDA打开. 1.提示使用什么格 ...
- HBase 架构脑图
https://docs.transwarp.io/5.0/goto?file=HyperbaseManual_intro-hbase.html#intro-hbase
- Go实用开源库收集
框架 https://github.com/go-martini/martini 图形验证码 https://github.com/dchest/captcha ORM https://github. ...
- RabbitMQ系列(一)RabbitMQ在Ubuntu上的环境搭建
环境配置 Ubuntu Server 18.04 RabbitMQ 3.6.10 安装之前 我们使用apt-get进行RabbitMQ安装,在安装之前,强烈建议您把apt源换位国内,大大增加下载安装的 ...
- 完整例子-正则控制input的输入
转 : https://www.cnblogs.com/ckf1988/p/5619337.html
- μC/OS-II 中的任务管理
1. 任务的状态及其转换 睡眠状态: 任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态. 等待状态: 正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会 ...