简单实现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. 怎么自定义DataGridViewColumn(日期列,C#)

    参考:https://msdn.microsoft.com/en-us/library/7tas5c80.aspx 未解决的问题:如果日期要设置为null,怎么办? DataGridView控件提供了 ...

  2. api_DZFPKJ & api_DZFPCX

    AES加密算法的网站:http://www.ssleye.com/aes_cipher.html """ AES加密(加解密算法/工作模式/填充方式:AES/ECB/PK ...

  3. [Abp vNext 入坑分享] - 3.简单的用户模块功能开发

    一.简要说明 本篇文章开始进行业务模块的开发模拟,借助user模块来进行业务开发,主要是用户相关的基础操作.主要是先使用Users来体验整个开发的流程.主要是先把一个基础流程跑顺利,在这里我并不会过于 ...

  4. 负载均衡服务之HAProxy基础配置(二)

    前文我们聊了下haproxy的global配置段中的常用参数的说明以及使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12763245.html:今天我们来 ...

  5. Codeforces 1340B Nastya and Scoreboard(dp,贪心)

    题目链接OvO 题目大意   给你\(n\)串数字,\(1\)代表该位置是亮的,\(0\)代表是灭的.你必须修改\(k\)个数字,使某些\(0\)变为\(1\).注意,只能把原来的\(0\)改成\(1 ...

  6. 认证与授权】Spring Security系列之认证流程解析

    上面我们一起开始了Spring Security的初体验,并通过简单的配置甚至零配置就可以完成一个简单的认证流程.可能我们都有很大的疑惑,这中间到底发生了什么,为什么简单的配置就可以完成一个认证流程啊 ...

  7. 2019-2020-20199303《Linux内核原理与分析》第四周作业

    构造一个简单的Linux内核 Linux是一种开源电脑操作系统内核,它是一个用C语言写成.主要子系统: 1.系统调用接口 2.进程管理 3.内存管理 4.虚拟文件系统 qemu是一个开源模拟处理器,在 ...

  8. Memcached在企业中的应用

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

  9. docker-compose简介及安装

    一.简介 Compose是用于定义和运行多容器Docker应用程序的工具,是docker的服务编排工具,主要应用于构建基于Docker的复杂应用,compose通过一个配置文件来管理多个docker容 ...

  10. hdu_2570 迷障 贪心

    迷瘴 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...