Scala学习笔记之Actor多线程与线程通信的简单例子
题目:通过子线程读取每个文件,并统计单词数,将单词数返回给主线程相加得出总单词数
package review
import scala.actors.{Actor, Future}
import scala.collection.mutable.HashSet
import scala.io.Source
/**
* @author Mr.Xu
* @version v1.0
* Date:2018-03-12
*/
//通过子线程读取每个文件,并统计单词数,将单词数返回给主线程相加得出总单词数 //建立子线程Actor模型
class Actor1 extends Actor{
override def act(): Unit ={
//使用轮询监听
while (true){
receive{
case readFile(fname: String) =>{
//匿名函数
var num: Int = 0
val read = Source.fromFile(fname)
val lines = read.getLines()
for (line <- lines) {
num = num + line.toString.split(" ").length
}
}
//返回给主线程的消息
sender ! num
}
}
}
}
//样例
case class readFile(fname: String)
case class result(fname: String,int: Int){
println(fname+"文件的单词个数为"+int)
} object ActorMain extends App {
//文件集合
var files = Array("E:\\File\\word\\a.txt","E:\\File\\word\\b.txt","E:\\File\\word\\c.txt","E:\\File\\word\\a.txt","E:\\File\\word\\a.txt","E:\\File\\word\\a.txt")
val a = new Actor1
a.start()
//返回结果集,可以用来判断该线程是否返回了结果
var replySet = new HashSet[Future[Any]]
var sum = 0
for (f <- files){
val reply:Future[Any] = a !! readFile(f)
replySet +=reply
}
//若该线程执行完成并返回了结果,则将各个结果累加,并将该线程从结果集合中移除
while (replySet.nonEmpty){
val toC =replySet.filter(_.isSet)
for (r <- toC){
val reply:Any = r.apply()
sum=sum+count(reply)
replySet.remove(r)
}
}
println("总的单词数为:"+sum)
//取整型函数
def count(s:Any): Int ={
s.toString.toInt
}
}
小徐看世界,世界如此多娇: http://www.cnblogs.com/schoolbag/diary/2018/03/13/8563019.html
Scala学习笔记之Actor多线程与线程通信的简单例子的更多相关文章
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- 转:学习笔记:delphi多线程学识
学习笔记:delphi多线程知识 最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处 ...
- Scala学习笔记及与Java不同之处总结-从Java开发者角度
Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续 ...
- C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo
在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架 ...
- Django学习笔记(一):环境安装与简单实例
Django学习笔记(一):环境安装与简单实例 通过本文章实现: Django在Windows中的环境安装 Django项目的建立并编写简单的网页,显示欢迎语与当前时间 一.环境安装 结合版本兼容性等 ...
- Android(java)学习笔记216:多线程断点下载的原理(Android实现)
之前在Android(java)学习笔记215中,我们从JavaSE的角度去实现了多线程断点下载,下面从Android角度实现这个断点下载: 1.新建一个Android工程: (1)其中我们先实现布局 ...
- Android(java)学习笔记159:多线程断点下载的原理(Android实现)
之前在Android(java)学习笔记215中,我们从JavaSE的角度去实现了多线程断点下载,下面从Android角度实现这个断点下载: 1. 新建一个Android工程: (1)其中我们先实现布 ...
- Scala学习笔记之:tuple、array、Map
[TOC] 本文<快学Scala>的笔记 tuple学习笔记 tuple的定义 对偶是元组(tuple)的最简单形态--元组是不同类型的值的聚集. 元组的值是通过将单个值包含在圆括号中构成 ...
- 机器学习(三)--- scala学习笔记
Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. Spark是UC Berkeley AMP lab所开源的类Had ...
随机推荐
- stm32函数库分析
1.STM32F10x_StdPeriph_Lib_V3.5.0 是库函数的全称 2.libraries里面包含的是函数库.C和.H以及CMSIS部分 3.Project里面包含针对MCU各个模块的 ...
- Java 编码规范(转)
本文转自:http://www.javaranger.com/archives/390 文章总结出了java编码过程中的一些规范,以便参考. 1.合理组织代码层次,分层清晰:controller.lo ...
- 09 OCP知识点讲解 之 LRU链与脏LRU链
OCP知识点讲解 之 LRU链与脏LRU链 分类: Oracle 2012-06-30 10:49:26 一.LRU链: 任何缓存的大小都是有限制的,并且总不如被缓存的数据多.就像Buffer c ...
- 断言assert()与调试帮助
列表内容assert()是一种预处理宏(preprocessor marco),使用一个表达式来作为条件,只在DEBUG模式下才有用. assert(expr); 对expr求值,如果expr为假,则 ...
- rz/sz:工作原理
我们知道用linux命令rz/sz可以通过一些终端软件如secureCRT等在linux服务器与本地windows之间传文件.在服务器上rz一下,在本地windows下就跳出一个窗口,选择文件后就传到 ...
- 企业IT架构转型之道 读后感
放假三天,用部分时间阅读了企业IT架构转型之道这本书.第一遍潦草读完,就感觉收益颇多.这本书值得多读几遍,适合精度. 作为银行IT开发人员,在央企IT成本部门的大背景下,开发过程中遇到的诸多疑惑.困惑 ...
- python教程(二)·第一个python程序
几乎所有的计算机语言教程,不仅仅是python,都以这样一个相似的示例程序开始讲解--Hello World! 代码如下,简简单单的一行.想必稍微了解英语的读者,都能猜到这段代码功能吧. print( ...
- RMI入门HelloWorld
java RMI(Remote Method Invocation)是一种基于java远程调用技术,是对RPC的java实现,可以在不同主机上进行通信与方法调用.PRC通信原理如图: 方法调用从客户对 ...
- Developing iOS 8 Apps with Swift (stanford)
https://www.youtube.com/watch?v=JkiB8Zwk-9Q&index=2&list=PLcX0opNQliFl0RTGbY9HHWCFg0Q8_fIF4
- VMWare虚拟机的网络类型配置选择详解
VMWare虚拟机网络有三种类型,当然还有最后一种类型就是“不使用网络连接”,哈哈....... VMWare在安装会有让选择网络类型的选项,如果不确认使用那一种网络类型,也可以先随便选择一种网络类型 ...