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.函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称 ...
随机推荐
- TCP/IP 笔记 - TCP拥塞控制
拥塞控制是TCP通信的每一方需要执行的一系列行为,这些行为有特定算法规定,用于防止网络因为大规模的通信负载而瘫痪.其基本方法是当有理由认为网络即将进入拥塞状态(或已由于拥塞而出现路由丢包情况)时减缓T ...
- Unity3D热更新之LuaFramework篇[03]--prefab加载和Button事件
在上一篇文章 Unity3D热更新之LuaFramework篇[02]--用Lua创建自己的面板 中,我介绍了LuaFramework加载面板的方法,但这个方法并不适用于其它Prefab资源,在这套框 ...
- eclipse导入的项目resource包被当做成文件夹
项目中遇到的问题: 导出的项目(错误) 原本应该是这样的 需要这样设置一下: 1 2 最后就变回来了!
- Spring Boot入门(11)实现文件下载功能
在这篇博客中,我们将展示如何在Spring Boot中实现文件的下载功能. 还是遵循笔者写博客的一贯风格,简单又不失详细,实用又能让你学会. 本次建立的Spring Boot项目的主要功能 ...
- Java爬虫之下载全世界国家的国旗图片
介绍 本篇博客将继续上一篇博客:Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗 的内容,将用Java来实现这个爬虫,下载全世界国家的国旗图片. ...
- 使用Task异步执行方法_多线程_应用程序池
偶然遇到在执行登录的方法需要发送消息队列导致登录时间过长的问题,从网上查了一些方法,先将一个简单的异步处理程序的小例子展示出来,供大家参考: 备注:该方法是从应用程序程序所在的线程池中获取线程,第一次 ...
- 【转载】IIS报错不是有效的Win32应用程序
今天在IIS中部署ASP.NET网站后,访问网站报错,提示信息为:未能加载文件或程序集XXX.dll或它的某一个依赖项,不是有效的Win32应用程序(异常来至HRESULT:0x800700C1).通 ...
- C++中的stack类、QT中的QStack类
C++中的stack 实现一种先进后出的数据结构,是一个模板类. 头文件 #include<stack> 用法(以int型为例): stack <int> s; //定义一个i ...
- springboot调优
application.properties server.tomcat.max-connections=0 # Maximum number of connections that the serv ...
- 缓存MEMCACHE php调用(一)
在项目中,涉及大访问量时,合理的使用缓存能减轻数据库的压力,同时提升用户体验.即在非实时性的需求的前提下,一小段时间内(若干秒),用于显示的数据从缓存中获取的,而不用直接读取数据库,能有效的减少数据库 ...