简单实现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. 解决Jquery中click里面包含click事件,出现重复执行的问题

    出现问题的代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.o ...

  2. Teradata 数据库

    笔者大学所学计算机专业,读书时接触过Oracle.mysql和SQL SERVER,一度坐井观天觉得数据库应该也就这些了,但自笔者毕业进入数据仓库这个行业,接触的第一个商业数据库即是Teradata, ...

  3. Flask基础-01.Flask简介

    Flask简介 Web应用程序作用 Web(World Wide Web)诞生最初的目的,是为了利用互联网交流工作文档. 关于Web框架 1. 什么是Web框架? 1. 已经封装好了一段代码,协助程序 ...

  4. 详解 NIO流

    在观看本篇博文前,建议先观看本人博文 -- <详解 IO流> NIO流: 首先,本人来介绍下什么是NIO流: 概述: Java NIO ( New IO )是从 Java 1.4 版本开始 ...

  5. SSH proxycommand 不在同一局域网的机器ssh直连

    本地和192.168.1.10不在同一个网络,可以通过jumpserver跳转过去,操作如下 选项 -L 本机端口 -f 后台启用,可以在本机直接执行命令,无需另开新终端 -N 不打开远程shell, ...

  6. 负载均衡服务之HAProxy基础配置(三)

    前文我们聊到了haproxy的代理配置段中比较常用的配置指令的用法以及说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12770930.html:今天我们来 ...

  7. Win10桌面美化

    捯饬了几个小时终于捯饬好了,没什么特效,就是看起来干净了许多. 用到的小软件: 链接:https://pan.baidu.com/s/1_PSTn0JZ22ZGiMDOdvdWEw提取码:329c 1 ...

  8. 我个人常用的git命令

    在还没有习惯用命令行之前,我建议用一下sourcetree这个软件熟悉一下流程. 使用 git clone 拷贝一个 Git 仓库到本地:git clone url 添加所有的文件到缓存区: git ...

  9. 如何使用Markdown 编写文档

    Markdown 是一种轻量级标记语言,用来编写文本文档,一般后缀名为.md.该语言在 2004 由约翰·格鲁伯(John Gruber)创建. 由于Markdown 语法简单,易读易写,变得越来越通 ...

  10. Spring Boot 之Spring data JPA简介

    文章目录 添加依赖 添加entity bean 创建 Dao Spring Data Configuration 测试 Spring Boot 之Spring data JPA简介 JPA的全称是Ja ...