scala Actor -03

  1.对于上一篇讲解的scala的一些补充

    val files = Array[String]("a.txt","b.txt","c.txt")

    for(f <- files){xxxx}

  目标一:熟悉Scala Actor并发编程

  目标二:为学习Akka做准备

    注:我们现在学的Scala Actor是scala 2.10.x版本及以前版本的Actor。

    Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,

    老版本的Actor已经废弃

   2.概念

    Scala中的Actor能够实现并行编程的强大功能,它是基于事件模型的

    并发机制,

    Scala是运用消息(message)的发送、接收来实现多线程的。

    使用Scala能够更容易地实现多线程应用的开发

   3.Actor方法执行顺序

    1.首先调用start()方法执行Actor

    2.调用start()方法后其act()方法会被执行

    3.向Actor发送消息

   4.wordCount的Actor的计算方法,虽然现在不用,但是思路还是有用的

    

package main.cn.wj.test
import scala.actors.{Actor, Future}
import scala.collection.immutable.HashSet
import scala.io.Source
import scala.collection.mutable.ListBuffer
/**
  * Created by WJ on 2016/12/22.
  */

class Task extends Actor{
  override def act(): Unit = {
      loop{
             react{
               case   SubmitTask(filename) =>{
                 val result = Source.fromFile(filename).getLines().flatMap(_.split(" ")).map((_,1)).toList.groupBy(_._1).mapValues(_.size)
                 sender ! ResultTask(result)
               }
               case StopTask =>{
                 exit()
               }
             }
      }
  }
}

case class SubmitTask(filename:String)

case class ResultTask (result:Map[String,Int])

case object StopTask

object ActorWordCount {
  def main(args: Array[String]): Unit = {
    var replySet = new HashSet[Future[Any]]()
    val resultList =  new ListBuffer[ResultTask]
    val files = Array[String]("E://Test/words.log", "E://Test/words.txt")
    for (f <- files) {
         val actor = new Task
         val reply = actor.start() !! SubmitTask(f)    //<reply 等同于Future>
         replySet  += reply
    }
    while(replySet.size > 0 ){
      val toCompute = replySet.filter(_.isSet)
      for(f <- toCompute) {
         val result = f.apply().asInstanceOf[ResultTask]
        resultList += result
        replySet -= f
      }
      Thread.sleep(100)
    }

    // reduce功能 ,汇总
    //List
    val fr = resultList.flatMap(_.result).groupBy((_._1)).mapValues(_.foldLeft(0)(_+_._2))
    println(fr)
  }
}

  5.看了上面的关于多线程相关的知识点,看看我们的线程池的代码

  

package main.cn.wj.test

import java.util.concurrent.{Executor, Executors}

/**
  * Created by WJ on 2016/12/22.
  */
object ThreadDemo {
  def main(args: Array[String]): Unit = {
       val pool = Executors.newFixedThreadPool(5);
    for (i <- 1 to 10){
      pool.execute(new Runnable {
        override def run(): Unit = {
          println(Thread.currentThread().getName)
          Thread.sleep(1000)
        }
      })
    }
  }
}
时间: 2024-11-08 20:47:54

scala Actor -03的相关文章

scala actor编程之对象传递

scala 最吸引人的一点就是actor并发编程了.但是纵观scala官方文档,baidu文档,IBM文档都写的通过字符串传呀传,如果用作actor编程说明当然没有问题.但是在正式开放中,光传字符串就显的势单力薄了. 所以如何传对象呢? 先看通过字符串传递消息的模型: 消息接收类: import scala.actors.Actor import org.andy.rtbd.actor.ActorDeal class ActorRev1 extends Actor{ def act()={ wh

Akka 3 Akka actor 与 scala actor的不同

经常有人问: Akka的Actor和Scala的Actor有什么不同?这里的回答是,从actor 模型角度讲,没什么不同,它们都实现了actor model. Akka actors and Scala actors are two implementations of that model. All Actor model says that your concurrency primitives are actors, which can: receive a message and dec

Scala基础03:数组

Scala数组 定长数组 声明数组的基本格式: val arr =  new Array[T](N) 例: val nums = new Array[Int](10) val strs = new Array[String](10) 数组声明时若不给出值,会被初始化,初始化后同样能对数组成员进行赋值. 数组成员初始化,如Int类型的会都被初始化为0,String类型的会被初始化为null. 为数组直接赋值 基本格式: val arr = Array( x1,x2,....xn); 例: val

大数据系列修炼-Scala课程03

前言 今天上班看了很多关于前端js,jQuery.bootstrap.js以及springMVC看得迷迷糊糊的,毕竟以前很少去学习前端的技术,所有看得有点困,还好看得比较多,回家后也开始学习关于Scala相关的课程,实验一下每天坚持做大数据相关的事情,一年后会成为什么样子......期待中....,今天也接着昨天的课程继续. Scala内部类实战详解 Scala内部类详解:scala中内部类要访问外部类直接把外部类的对象给内部类了,让其自己访问,内部类也需要实例化,这和java中有很多的区别,内

Scala笔记整理(九):Actor和AKKA

[TOC] 概述 ? Scala的Actor有点类似于Java中的多线程编程.但是不同的是,Scala的Actor提供的模型与多线程有所不同.Scala的Actor尽可能地避免锁和共享状态,从而避免多线程并发时出现资源争用的情况,进而提升多线程编程的性能. Spark中使用的分布式多线程框架,是Akka,是Scala的一种多线程的类库.Akka也实现了类似Scala Actor的模型,其核心概念同样也是Actor.Scala Actor模型已经在2.1.0的时候还在用,但是在2.1.1的时候已经

Scala 深入浅出实战经典 第67讲:Scala并发编程匿名Actor、消息传递、偏函数解析

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/LwsfuGIsWEk/优酷:http://v.youku.com/v_show/id_

Scala学习笔记--Actor和并发

未完成. SimpleActor.scala //actor是一个类似线程的实体,它有一个用来接收消息的信箱. //实现actor的方法是继承Scala.actors.Actor并完成其act方法 //通过调用actor的start方法来启动它 class SillyActor extends Actor{ def act(){ for(i<- 1 to 5){ println("Actor"+i) Thread.sleep(1000); } } } object MyActor

scala学习笔记-Actor(19)

Scala的Actor类似于Java中的多线程编程.但是不同的是,Scala的Actor提供的模型与多线程有所不同.Scala的Actor尽可能地避免锁和共享状态,从而避免多线程并发时出现资源争用的情况,进而提升多线程编程的性能.此外,Scala Actor的这种模型还可以避免死锁等一系列传统多线程编程的问题. Spark中使用的分布式多线程框架,是Akka.Akka也实现了类似Scala Actor的模型,其核心概念同样也是Actor Actor的创建.启动和消息收发 1 // Scala提供

Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/mm3eDHk3T5o/优酷:http://v.youku.com/v_show/id