简单实现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 3 的解释器

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Yangtze PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  2. BUG 测试计划

       性能追求 目前状况 测试标准 APP平稳运行,无crush现象   快速下拉翻页时,崩溃退出     要求多人使用,均流畅无异常退出方可               页面的放大缩小不会造成页面显 ...

  3. golang slice 源码解读

    本文从源码角度学习 golang slice 的创建.扩容,深拷贝的实现. 内部数据结构 slice 仅有三个字段,其中array 是保存数据的部分,len 字段为长度,cap 为容量. type s ...

  4. C语言二维数组超细讲解

    用一维数组处理二维表格,实际是可行的,但是会很复杂,特别是遇到二维表格的输入.处理和输出. 在你绞尽脑汁的时候,二维数组(一维数组的大哥)像电视剧里救美的英雄一样显现在你的面前,初识数组的朋友们还等什 ...

  5. 3. string

    let str = "my string"; 1. str.startsWith('my'); //true2.str.endsWith('my'); //false3.str.i ...

  6. Springboot:定时任务处理(十三)

    构建一个定时任务的service接口及实现(模拟) 接口:com\applesnt\springboot\service\TaskService.java package com.applesnt.s ...

  7. UML 建模工具的安装与使用

    一. 实验目的1) 学习使用 EA(Enterprise Architect) 开发环境创建模型的一般方法: 2) 理解 EA 界面布局和元素操作的一般技巧: 3) 熟悉 UML 中的各种图的建立和表 ...

  8. 大数据作业之利用MapRedeuce实现简单的数据操作

    Map/Reduce编程作业 现有student.txt和student_score.txt.将两个文件上传到hdfs上.使用Map/Reduce框架完成下面的题目 student.txt 20160 ...

  9. CentOS 7 + Win 双系统的安装遇到的重要问题

    前言:对于刚学linux的朋友们,多多小小因为各种原因需要装双系统,亦或者爱好使然.多数是问题解决,第一次装系统者不推荐看-. 那么现在内德在此就说说在本本上装双系统会遇到的问题及其解决方法. 环境准 ...

  10. java 8中构建无限的stream

    目录 简介 基本使用 自定义类型 总结 java 8中构建无限的stream 简介 在java中,我们可以将特定的集合转换成为stream,那么在有些情况下,比如测试环境中,我们需要构造一定数量元素的 ...