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并发编程【进阶】的更多相关文章

  1. Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  2. Scala 深入浅出实战经典 第67讲:Scala并发编程匿名Actor、消息传递、偏函数解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  3. Scala 深入浅出实战经典 第66讲:Scala并发编程实战初体验

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  4. Scala并发编程react、loop代码实战具体解释

    演示样例代码及凝视: //scala并发编程中的react和loop,共同特点: //通过线程存用的方式让性能有所提升. //Actor本身的运行,被actor子系统管理的时候,会有一个或者多个远程的 ...

  5. Scala并发编程【快速入门】

    1.简介 Scala的actor提供了一种基于事件的轻量级线程.只要使用scala.actors.Actor伴生对象的actor()方法,就可以创建一个actor.它接受一个函数值/闭包做参数,一创建 ...

  6. 王家林系列之scala--第69讲:Scala并发编程react、loop代码实战详解

    刚才看了一下,群里王家林老师又更新课程了,真为王老师的勤奋感到佩服,于是迫不及待的下载下来观看学习.本期讲的是关于scala并发编程的react.loop代码实战. 信息来源于 DT大数据梦工厂微信公 ...

  7. Scala函数式编程进阶

    package com.dtspark.scala.basics /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式 ...

  8. Scala并发编程

    Scala的actor提供了一种基于事件的轻量级线程.只要使用scala.actors.Actor伴生对象的actor方法,就可以创建一个actor.它接受一个函数值/闭包做参数,一创建好就开始运行. ...

  9. Scala并发编程模型AKKA

    一.并发编程模型AKKA Spark使用底层通信框架AKKA 分布式 master worker hadoop使用的是rpc 1)akka简介 写并发程序很难,AKKA解决spark这个问题. akk ...

  10. Scala实战高手****第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏

    /** * 函数式编程进阶: * 1.函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量 * 2.函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称 ...

随机推荐

  1. Centos7使用docker搭建gitlab服务器

    了解到docker的优点,搭建快,运行要求资源低,最重要的是实现的功能和效果都能达到预期,于是决定使用docker来搭建gitlab服务器. 效果图如下: 系统环境:CentOS Linux rele ...

  2. Django | 页面数据的缓存与使用

    为什么要使用缓存? 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求页面,服务器会重新计算.从开销处理的角度来看,这比你读取一个现成的标准文件的代价要昂贵的多 使用缓存,将多用户访问时基本相同 ...

  3. leetcode — count-and-say

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...

  4. Gradle nexus 解决开发机器不连网无法下载gradle插件问题

    在用gradle时常规配置如下(D:\gradle-4.9\init.d\init.gradle文件,没有这个文件时自建): ext { nexus = 'http://192.168.127.128 ...

  5. Socket网络编程基本介绍

    一,socket的起源 socket一词的起源 在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的, 撰写者为Stephen Carr.Steve Crocker和Vi ...

  6. Python机器学习笔记——随机森林算法

    随机森林算法的理论知识 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法.随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为“代 ...

  7. MyBatis源码解析(七)——DataSource数据源模块之托管数据源

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675700.html 1 回顾 之前介绍的非池型与池型数据源都是MyBatis自己定义的内 ...

  8. C# 7.1中default关键字的新用法

    default 关键字有两类用法 switch语句中指定默认标签 默认值表达式 switch 语句 int caseSwitch = 1; switch (caseSwitch) { case 1: ...

  9. 【转载】window.open被浏览器拦截的解决办法

    今天在处理程序的过程中,发现window.open方法会被浏览器拦截,导致无法打开新页面,查阅相关资料后发现,主要原因是浏览器为了维护用户安全和体验,禁止在javascript中直接使用window. ...

  10. ASP.NET WEB API简介

      ASP.NET WEB API是基于.NET Framework用来构建Restful软件架构的框架,它是基于HTTP协议.Http不只是能够生成我们常见的web页面,它更是能够建立服务和面向资源 ...