简单实现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. Windows下如何将一个程序设为开机自启

    1.放在  开始-启动(C:\Users\Qi\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup)2.修改注册表[HKEY_L ...

  2. Python下将一般对象打印成Json

    有的时候,我们在写Python程序的时候,在处理复杂对象的时候,有的时候过程中调试,需要去看看产生的对象如何,有的时候我们可以把它打印成json来看,这个是个不错的办法. 对每一个对象写一个独立的打印 ...

  3. 带权值的图 BFS

    用bfs遍历最图求最短路径时通常借用优先队列即优先考虑最大的或者最小的权值 方法1 优先队列:(内置函数,优先考虑较小的权值) #include<iostream> #include< ...

  4. niuke --abc

    链接:https://ac.nowcoder.com/acm/contest/1083/A来源:牛客网 给出一个字符串s,你需要做的是统计s中子串”abc”的个数.子串的定义就是存在任意下标a< ...

  5. vue2.x学习笔记(三)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12562137.html. vue实例 要使用vue提供的特性与功能,都需要通过vue实例来使用. 创建一个vue实 ...

  6. [linux] 权限问题

    权限问题一直蒙蒙的,下面就是总结一下!(原文链接:http://www.cnblogs.com/chengJAVA/p/4319420.html) 指令名称:chmod 使用权限 : 所有使用者 使用 ...

  7. SpringCloud-Hystrix 服务降级、熔断

    Hystrix 是什么? Hystrix 是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时.异常等,Hystrix 能够保证在一个依赖出问题的情况下 ...

  8. 加不加 synchronized 有什么区别?

    今天一起来认识认识 synchronized 这个一面试就会被提到的关键字.这一篇不会讲太多理论,主要先熟悉熟悉一下最简单的用法.只讨论一个问题:方法没用 synchronized 和用了 synch ...

  9. 用 Python 黄图批量鉴别审核

    前言 最近写了一款微信小程序需要用到图片审核,人工审核是不可能的人工审核的太费精力了,所以我就写了一个多线程批量识别脚本来处理,主要是调用百度AI的接口,这里我是付费了也不贵审核一条1分钱不到,再说我 ...

  10. 不使用tomcat,仅适用javaSE手写服务器--模拟登陆

    1.搭建框架 我们只是简单模拟,框架简单分三个模块 a,服务器端server包 b,servlet,根据不同的请求url,利用反射生产对应的servlet c,IO工具包,用来关闭IO流 d,编写we ...