10.3.   Actor实战

10.3.1.    第一个例子

怎么实现actor并发编程:

1、定义一个class或者是object继承Actor特质,注意导包import scala.actors.Actor

2、重写对应的act方法

3、调用Actor的start方法执行Actor

4、当act方法执行完成,整个程序运行结束

详见代码。

说明:上面分别调用了两个单例对象的start()方法,他们的act()方法会被执行,相同与在java中开启了两个线程,线程的run()方法会被执行

注意:这两个Actor是并行执行的,act()方法中的for循环执行完成后actor程序就退出了

10.3.2.    第二个例子

怎么实现actor发送、接受消息

1、定义一个class或者是object继承Actor特质,注意导包import scala.actors.Actor

2、重写对应的act方法

3、调用Actor的start方法执行Actor

4、通过不同发送消息的方式对actor发送消息

5、act方法中通过receive方法接受消息并进行相应的处理

6、act方法执行完成之后,程序退出

详见代码。

10.3.3.    第三个例子

怎么实现actor可以不断地接受消息:

在act方法中可以使用while(true)的方式,不断的接受消息。

详见代码。

说明:在act()方法中加入了while (true) 循环,就可以不停的接收消息

注意:发送start消息和stop的消息是异步的,但是Actor接收到消息执行的过程是同步的按顺序执行

10.3.4.    第四个例子

使用react方法代替receive方法去接受消息

好处:react方式会复用线程,避免频繁的线程创建、销毁和切换。比receive更高效

注意:  react 如果要反复执行消息处理,react外层要用loop,不能用while

详见代码。

10.3.5.    第五个例子

结合case class样例类发送消息和接受消息

1、将消息封装在一个样例类中

2、通过匹配不同的样例类去执行不同的操作

3、Actor可以返回消息给发送方。通过sender方法向当前消息发送方返回消息

详见代码。

10.3.6.    练习实战

需求:

用actor并发编程写一个单机版的WordCount,将多个文件作为输入,计算完成后将多个任务汇总,得到最终的结果。

大致的思想步骤:

1、通过loop +react 方式去不断的接受消息

2、利用case class样例类去匹配对应的操作

3、其中scala中提供了文件读取的接口Source,通过调用其fromFile方法去获取文件内容

4、将每个文件的单词数量进行局部汇总,存放在一个ListBuffer中

5、最后将ListBuffer中的结果进行全局汇总。

详见代码。

最新文章

  1. 调用webapi 错误:使用 HTTP 谓词 POST 向虚拟目录发送了一个请求,而默认文档是不支持 GET 或 HEAD 以外的 HTTP 谓词的静态文件。的解决方案
  2. UOJ#246. 【UER #7】套路
  3. Android的Proxy/Delegate Application框架 (主要介绍插件化开发)
  4. ASP.NET MVC5---通过QueryString传值
  5. Buy Tickets
  6. 动态定义数组 .xml
  7. LINQ 基本子句之一 (select/where/group/into)
  8. mysql 存储过程中的declare 和 set @的两种变量的区别
  9. HibernateReview Day1 - Introduction
  10. python中函数的参数解析
  11. 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(下)- block中任性用self
  12. shopkeep/spark Dockerfile示例
  13. Codeforces 1076D Edge Deletion(最短路树)
  14. RNN通俗理解
  15. KMP算法自我理解 和 模板
  16. PHP 下载中文乱码解决
  17. setattr
  18. 在Microsoft Dynamic 365/2016环境使用LinqPad查询数据(不使用linqpad Microsoft Dynamic 365 Driver)
  19. LJ 5月6日A组考试考试题解
  20. js函数事件对象

热门文章

  1. hadoop学习笔记(七):hadoop2.x的高可用HA(high avaliable)和联邦F(Federation)
  2. Fiddler修改http请求响应简单实例
  3. LoadRunner通过webservice协议调用WSDL接口时,返回值不正确
  4. HDU2444 The Accomodation of Students(二分图最大匹配)
  5. UVA10600 ACM Contest and Blackout
  6. bootstrap当中,实现div居中
  7. ES6-对象的简写方式
  8. 吴裕雄--天生自然神经网络与深度学习实战Python+Keras+TensorFlow:Bellman函数、贪心算法与增强性学习网络开发实践
  9. IIS反向代理配置教程(最终完整版本)
  10. RT_THREAD之组件学习