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 extends Actor{
  def act (){
    Actor.receive{
      case x:Int =>println("got an Int: "+x)
      case _ =>println("not an int")
    }
  }
}

object SimpleActor{
  def main(args:Array[String]):Unit = {
   /*
    val sactor1 = new SillyActor();
    sactor1.start();

    //另一种方法:使用Actor中名为actor工具的方法来创建actor
    //actor在定义后立即启动,无需在调用start()
    val sactor2 = Actor.actor{
      for(i<-1 to 5){
        println("Another Actor"+i)
        Thread.sleep(1000);
      }
    }   */

    //另一种Actor,通过调用Actor.receive来接收消息
    //	actor发送消息时,它并不会阻塞,当actor接收消息时,它也不会被打断。发送的消息在接收actor的邮箱中等待处理,知道actor调用receive方法
    val sactor3 = Actor.actor{
      Actor.receive{
        case x :Int =>println("got an Int: "+x)
        case _ =>println("not an Int");
      }
    }
    sactor3 ! 12
    //通过调用Actor.receive接收消息的另一种形式
    MyActor.start()
    MyActor ! 14

    //将原生线程当成Actor
    Actor.self ! 15;  //这句要放在前面,放在后面则程序不会停止
    Actor.self.receive{
      case x :Int =>println("got an Int: "+x)
      case _ =>println("not an Int");
    }
    //Actor.self ! 15
    /*
     * 解释
     * 如果使用原生线程,最好用receive的变种receiveWithin。
     * 此方法可以指定一个以毫秒计的超时时限。
     * 如果在解释器命令行中使用receive的话,receive将会阻塞命令行,直到有消息到来,
     * 对self.receive而言,可能意味着永远等待下去。
     * 应该使用receiveWithin。并给出超时值
     * self.receiveWithIn(1000){case x => x}
     * */

  }
}

  

ReactActor.java

object ReactActor{
  def main(args:Array[String]):Unit={
    NameResolver.start();
    NameResolver ! ("www.baidu.com",Actor.self)

    NameResolver ! "msg1";
    NameResolver ! "EXIT"
    NameResolver ! "msg2";//已经结束,不会显示
  }
}

object NameResolver extends Actor{
  def act(){
    react{
      case (name:String, actor:Actor)=>
        println(getIp(name))
        //actor ! getIp(name);
        act();
      case "EXIT" =>
        println("Name resorver exit!");
      case msg =>
        println("Unhandled message" + msg);
        act();
    }
  }

  //获取IP地址
  def getIp(name:String):Option[InetAddress]={
    try{
      Some(InetAddress.getByName(name))
    }catch{
      case _:UnknownHostException =>None
    }
  }
}

  

时间: 2024-12-15 01:33:10

Scala学习笔记--Actor和并发的相关文章

scala学习笔记-Actor(19)

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

Scala学习笔记及与Java不同之处总结-从Java开发者角度

Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续更新一些切换后在开发过程中值得注意的地方.以下列举了部分,但令人印象深刻的Scala语言的不同之处,具体的代码演示样例及具体阐述见下文. ? Scala中可直接调用Java代码,与Java无缝连接. 语句能够不用";"结束.且推荐不适用";". 变量声明时以var或va

原创:Scala学习笔记(不断更新)

Scala是一种函数式语言和面向对象语言结合的新语言,本笔记中就零散记下学习scala的一些心得,主要侧重函数式编程方面. 1. 以递归为核心控制结构. 实现循环处理的方式有三种:goto,for/while,递归,其中用goto实现循环已经在现代语言中被放弃,而for/while形式的结构化编程成为主流,而递归作为另一种方案,则长期只流行在函数式编程的小圈子中. 递归被主流编程界所担心的主要是过深的调用栈,甚至以前的课堂上我们还亲自尝试过将递归改写为循环,但是现代函数式编程语言中,通过尾递归(

linux网络编程学习笔记之四 -----多线程并发服务端

相对于使用进程实现并发,用线程的实现更加轻量.每个线程都是独立的逻辑流.线程是CPU上独立调度运行的最小单位,而进程是资源分配的单位.当然这是在微内核的操作系统上说的,简言之这种操作系统的内核是只提供最基本的OS服务,更多参看点击打开链接 每个线程有它自己的线程上下文,包括一个唯一的线程ID(linux上实现为unsigned long),栈,栈指针,程序计数器.通用目的寄存器和条件码,还有自己的信号掩码和优先级.同一个进程里的线程共享这个进程的整个虚拟地址空间,包括可执行的程序文本.程序的全局

Scala学习笔记及与Java不同之处总结-从Java开发人员角度

Scala与Java具有许多相似之处,但又有许多不同.这里主要从一个Java开发人员的角度,总结在使用Scala的过程中所面临的一些思维转变.这里只是总结了部分两种语言在开发过程中的不同,以后会陆续更新一些切换后在开发过程中值得注意的地方.下面列举了部分,但令人印象深刻的Scala语言的不同之处,具体的代码示例及详细阐述见下文. ? Scala中可直接调用Java代码,与Java无缝连接: 语句可以不用";"结束,且推荐不适用";": 变量声明时以var或val开头

Scala学习笔记一之基础语法,条件控制,循环控制,函数,数组,集合

前言:Scala的安装教程:http://www.cnblogs.com/biehongli/p/8065679.html 1:Scala之基础语法学习笔记: 1:声明val变量:可以使用val来声明变量,用来存放表达式的计算结果,但是常量声明后是无法改变它的值的,建议使用val来声明常量: 声明var变量:如果要声明可以改变的引用,可以使用var变量,声明的常量的值可以改变. 3:指定类型:无论声明val变量还是声明var变量.都可以手动指定其类型,如果不指定,scala会自动根据值,进行类型

Scala学习笔记-环境搭建以及简单语法

关于环境的搭建,去官网下载JDK8和Scala的IDE就可以了,Scala的IDE是基于Eclipse的. 下面直接上代码: 这是项目目录: A是scala写的: package first import scala.collection.mutable.ListBuffer object A { def main(args: Array[String]) { print("Hello,Scala");//学习程序设计的第一句 println("---");//pr

Scala并发编程实战初体验及其在Spark源码中的应用解析之Scala学习笔记-56

package com.leegh.actor import scala.actors.Actor /** * @author Guohui Li */object First_Actor extends Actor { def act() { for (i <- 1 to 10) { println("Step : " + i) println(Thread.currentThread().getName) Thread.sleep(2000) } }} object Seco

Scala学习笔记7 (actor)

7.   actor http://www.scala-lang.org/docu/files/actors-api/actors_api_guide.html# Scala中处理并发,有很多选择: l  actor消息模型,类似Erlang,首选,Lift和akka也实现了自己的actor模型. l  Thread.Runnable l  java.util.concurennt l  3rd并发框架如Netty,Mina 7.1.     actor模型 Java内置线程模型 Scala a