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 ...
随机推荐
- C#的常用类
BitConverter类:用于将源类型转换成字节数组,或者将字节数组转换成目标类型.在解决不同设备之间产生的大小端问题时,经常使用. Convert类:用于基本数据类型(包括Boolean/Byte ...
- 一点一点看JDK源码(二)java.util.List
一点一点看JDK源码(二)java.util.List liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 List译为表,一览表, ...
- JSON.stringify()和JSON.parse()的区别
JSON.stringify()此方法用于将一个对象解析成字符串并返回. JSON.parse()此方法刚好相反是将一个字符串对象解析成一个JSON对象.
- POJ 2208--Pyramids(欧拉四面体体积计算)
Pyramids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3451 Accepted: 1123 Specia ...
- CentOS7 使用chrony搭建集群中的时间同步服务
一.集群环境: 系统:CentOS7-minimal 集群中的两台主机ip:10.132.226.103/24 10.132.226.104/24 二.CentOS7中时间相关命令timedatec ...
- 使用WIn10自带的Linux子系统
最近一直有安装虚拟机的想法,今天刚刚知道win10有自带的Linux子系统,就准备试一下: 首先要保证自己的电脑处于开发者选项: 然后就要在控制面板的程序和功能页面点击“启用或者关闭WIndows功能 ...
- JS实现继承 JavaScript
JS实现继承 JavaScript 定义一个父类: // 定义一个动物类 function Animal (name) { // 属性 this.name = name || 'Animal'; // ...
- Java并发编程:浅析几种线程安全模型 [转]
多线程编程一直是老生常谈的问题,在Java中,随着JDK的逐渐发展,JDK提供给我们的并发模型也越来越多,本文摘取三例使用不同原理的模型,分析其大致原理.目录如下: 1.COW之CopyOnWrite ...
- Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习
本程序只是使用了一些基本的知识点编写了一个比较简单粗陋的txt文本阅读器,效率不高,只适合新手练习.所以大神勿喷. 其实想到编写这种程序源自本人之前喜欢看小说,而很多小说更新太慢,所以本人就只能找一个 ...
- hadoop生态搭建(3节点)-15.Nginx_Keepalived_Tomcat配置
# Nginx+Tomcat搭建高可用服务器名称 预装软件 IP地址Nginx服务器 Nginx1 192.168.6.131Nginx服务器 Nginx2 192.168.6.132 # ===== ...