简单实现Actor并发编程

import scala.actors.Actor
//todo 使用actor实现并发编程
class Actor1 extends Actor{
override def act(): Unit = {
for (i <- 1 to 10){
println(s"actor1_$i")
Thread.sleep(2000)
}
}
} class Actor2 extends Actor{
override def act(): Unit = {
for (i <- 1 to 10){
println(s"actor2_$i")
Thread.sleep(2000)
}
}
} object ActorTest{
def main(args: Array[String]): Unit = {
//创建Actor对象
val actor1 = new Actor1
val actor2 = new Actor2
//启动actor
actor1.start()
actor2.start()
//
}
}
控制台结果

actor2_1
actor1_1
actor2_2
actor1_2
actor2_3
actor1_3
actor1_4
actor2_4
actor1_5
actor2_5
actor1_6
actor2_6
actor2_7
actor1_7
actor1_8
actor2_8
actor1_9
actor2_9
actor2_10
actor1_10

使用Actor实现发送没有返回值的异步消息

import scala.actors.Actor

class Actor3 extends Actor{
override def act(): Unit = {
//act内部使用receive,偏函数用于消息的接受处理
receive{
case "start" => println("正在启动>>>>>>>>>>>>>>")
} }
} object Actor3 {
def main(args: Array[String]): Unit = {
//创建Actor对象
val actor = new Actor3
//启动Actor
actor.start()
/*
! 发送异步消息,没有返回值。
!? 发送同步消息,等待返回值。
!! 发送异步消息,返回值是 Future[Any]。
*/
//发送没有返回值的异步消息
actor ! "start"
}
}
控制台结果

正在启动>>>>>>>>>>>>>>

使用Actor实现不间断消息发送

import scala.actors.Actor

class Actor4 extends Actor {
override def act(): Unit = {
//利用while(true)实现持续不间断发送消息
while (true) {
receive {
case "start" => println("正在启动>>>>>>>>>>>>")
case "send" => println("发送中>>>>>>>>>>>>")
//接收到"quit"字符串时,退出系统,中断循环
case "quit" => System.exit(0)
}
}
}
} object Actor4 {
def main(args: Array[String]): Unit = {
//创建Actor对象
val actor = new Actor4
//启动Actor
actor.start()
//发送消息
actor ! "start"
actor ! "send"
actor ! "quit"
}
}
控制台结果

正在启动>>>>>>>>>>>>
发送中>>>>>>>>>>>> Process finished with exit code 0

用react方法替代receive方法接收消息

import scala.actors.Actor

class Actor5 extends Actor{
override def act(): Unit = {
//利用react实现消息的接收,比receive效率更高,react方式会复用线程,避免频繁的线程创建、销毁和切换
//如果要用react持续不间断接收,需要在外层加loop
loop {
react {
case "start" => println("正在启动>>>>>>>>>>>>")
case "send" => println("发送中>>>>>>>>>>>>")
//接收到"quit"字符串时,退出系统,中断循环
case "quit" => System.exit(0)
}
}
}
} object Actor5{
def main(args: Array[String]): Unit = {
//创建Actor对象
val actor = new Actor5
//启动Actor
actor.start()
//发送消息
actor ! "start"
actor ! "send"
actor ! "quit"
}
}
控制台结果

正在启动>>>>>>>>>>>>
发送中>>>>>>>>>>>>

结合case class,通过匹配不同的样例类执行不同操作

import scala.actors.{Actor, Future}

//异步消息样例类
case class AsyncMessage(id:Int,msg:String)
//回复消息样例类
case class ReplyMessage(msg:String)
//同步消息样例类
case class SyncMessage(id:Int,msg:String) class Actor6 extends Actor{
override def act(): Unit = {
loop{
react{
case AsyncMessage(id,msg) => {
println(s"id:$id=======msg:$msg")
// 对于消息接收者,可以使用sender回复消息
sender ! ReplyMessage("Roger that!")
}
case SyncMessage(id,msg) => {
println(s"id:$id=======msg:$msg")
}
}
} }
} object Actor6{
def main(args: Array[String]): Unit = {
//创建Actor
val actor = new Actor6
//启动Actor
actor.start()
/*
! 发送异步消息,没有返回值。
!? 发送同步消息,等待返回值。
!! 发送异步消息,返回值是 Future[Any]。
*/
//发送没有返回值的异步消息
actor ! AsyncMessage(1,"This is AsyncMessage and no returned value.") //发送有返回值的异步消息
//Futureb表示一个异步操作的结果状态,可能还没有实际完成的异步任务的结果
val future: Future[Any] = actor !! AsyncMessage(2, "This is AsyncMessage and needs returned value.")
//根据返回的状态提取最终的结果
val replyMessage: ReplyMessage = future.apply().asInstanceOf[ReplyMessage]
println(replyMessage) //发送同步消息
actor !? SyncMessage(3,"This is SyncMessage!") }
}
控制台结果

id:1=======msg:This is AsyncMessage and no returned value.
id:2=======msg:This is AsyncMessage and needs returned value.
ReplyMessage(Roger that!)
id:3=======msg:This is SyncMessage!

【Scala】代码实现Actor多种需求的更多相关文章

  1. scala当中的Actor并发编程

    注:Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃. 1.什么是Sc ...

  2. 第4节 Scala中的actor介绍:1、actor概念介绍;2、actor执行顺序和发送消息的方式

    10.    Scala Actor并发编程 10.1.   课程目标 10.1.1.    目标一:熟悉Scala Actor并发编程 10.1.2.    目标二:为学习Akka做准备 注:Sca ...

  3. jdb调试scala代码的简单介绍

    在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...

  4. Scala:Java 项目中混入scala代码

    Spark 是用Scala代码写的.为了调试Spark,做了如下尝试. 1.Eclipse下:Java 项目 ,Using Maven,编写了一个java 版Spark应用. Spark的代码(sca ...

  5. Spark学习笔记3(IDEA编写scala代码并打包上传集群运行)

    Spark学习笔记3 IDEA编写scala代码并打包上传集群运行 我们在IDEA上的maven项目已经搭建完成了,现在可以写一个简单的spark代码并且打成jar包 上传至集群,来检验一下我们的sp ...

  6. IntelliJ IDEA开发Scala代码,与java集成,maven打包编译

    今天尝试了一下在IntelliJ IDEA里面写Scala代码,并且做到和Java代码相互调用,折腾了一下把过程记录下来. 首先需要给IntelliJ IDEA安装一下Scala的插件,在IDEA的启 ...

  7. 创建工程支持scala代码开发

    第一步:idea当中创建创建普通maven工程 File ==> New ==> Project 第二步:修改pom.xml添加scala的版本以及打包插件 <dependencie ...

  8. Scala学习笔记--Actor和并发

    感谢博主lyrebing  博文地址:http://blog.csdn.net/lyrebing/article/details/20446061 1.  Actor用法 1.1 Actor的基本使用 ...

  9. scala中的Actor

    1.介绍 2.简单示例 3.第二个程序 4.通信程序 package day01 import scala.actors.Actor case class Message(content: Strin ...

随机推荐

  1. python的pip怎样更新包 + pip的help翻译

    1.pip下载安装 pip下载 进入https://pypi.python.org/pypi/pip,下载 .tar.gz压缩包 Linux安装pip # tar -xzvf pip-1.5.4.ta ...

  2. JAVA快速排序代码实现

    通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数.然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 快速 ...

  3. 使用dynamic 和MEF实现轻量级的 AOP 组件 (1)

    转载https://www.cnblogs.com/niceWk/archive/2010/07/19/1780843.html AOP魔法 今天你AOP了吗?谈到AOP,总有一种神秘的感觉,人类对于 ...

  4. gloo基本知识

    Architechture(架构) Gloo通过Envoy XDS gRPC API来动态更新Envoy配置, 更方便的控制Envoy Proxy, 并保留扩展性..本质是一个Envoy xDS配置翻 ...

  5. TensorFlow keras 迁移学习

    数据的读取 import tensorflow as tf from tensorflow.python import keras from tensorflow.python.keras.prepr ...

  6. python数据结构之栈的构建

    class Stack(object): def __init__(self): self.stack=[] def pop(self): return self.stack.pop() def pu ...

  7. Ubuntu创建WiFi:16.0.4

    点击编辑链接,点击桌面状态栏的网络图标 点击增加 类型选择WiFi 名称.SSID,均要填写,模式选择:热点 wifi安全性:选择一个安全模式,这里选的是, wpa 及 wpa2个人 必须说的是:选择 ...

  8. Memcached在企业中的应用

    Memcached简介 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitz ...

  9. Android应用程序开机开机启动

    有很过情况都需要Android程序开机自启,也就是在手机开机之后马上执行相应的Android程序. 实现的方法就是,在手机开机的时候接受相应的广播,在Android程序中接受相应的广播. 第1步:建立 ...

  10. js 实现动画功能,完整解析插件版 可更改配置参数[animate.js]

    前言:         本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽.         本篇文章为您分析一下原生JS写一个运动插件 基本功能: 补充 ...