Scala 并发编程之react和loop

1、react

package com.yy.enhance

import java.net.InetAddress
import java.net.UnknownHostException 
import actors._, Actor._
import scala.actors.Actor

/**
 * scala Actor构建在java的线程基础之上的,
 * 为了避免频繁的线程创建、销毁和切换等,scala中提供了react方法
 * 方法执行完毕后,仍然被保留
 */
object NameResolver extends Actor{
  def act(){
    react{
      //模式匹配
      case Net(name,actor) =>
        /**
         * 想actor发送解析后的IP地址
         * 该例中,actor为本身,即向本身发送消息,存入邮箱
         */
        actor!getIpAddress(name)
        //再次调用act方法,从本身邮箱中读取消息
        //如果消息为空,则等待
        act
      case "EXIT" =>
        println("Name resolver exiting.")
        //匹配邮箱中的单个信息,本例中会匹配邮箱中的IP地址信息
      case msg =>
        println("Unhandled message: " + msg)
        act
    }
  }
  
  def getIpAddress(name:String):Option[InetAddress] ={
    try{
       println(InetAddress.getByName(name))
       Some(InetAddress.getByName(name))
    } catch {
      case _: UnknownHostException => None
    }
  }
}
case class Net(name:String,actor:Actor)

object ActorWithReAct extends App {
  //启动Actor
  NameResolver.start()
  //发消息
  NameResolver!Net("www.baidu.com",self)
  
  //接收消息
  println(self.receive{case msg => msg})
}
结果如下:

www.baidu.com/119.75.217.109
Some(www.baidu.com/119.75.217.109)
从上述代码中看出:在react方法中加入act方法,方法执行完后没被销毁,而是继续试图从MailBox中获取消息,获取不到则继续等待。

2、使用loop方法实现react

package com.yy.enhance

import java.net.InetAddress
import scala.actors.Actor
import actors._, Actor._
import java.net.UnknownHostException

object NameResolver2 extends Actor{
  def act(){
    //使用loop方法
    loop{
       react{
          //模式匹配
          case Net2(name,actor) =>
            /**
             * 想actor发送解析后的IP地址
             * 该例中,actor为本身,即向本身发送消息,存入邮箱
             */
            actor!getIpAddress(name)
          case "EXIT" =>
            println("Name resolver exiting.")
            //匹配邮箱中的单个信息,本例中会匹配邮箱中的IP地址信息
          case msg =>
            println("Unhandled message: " + msg)
      }
    }
  }
  
  def getIpAddress(name:String):Option[InetAddress] ={
    try{
       println(InetAddress.getByName(name))
       Some(InetAddress.getByName(name))
    } catch {
      case _: UnknownHostException => None
    }
  }
}
case class Net2(name:String,actor:Actor)

object ActorWithLoop extends App {
   //启动Actor
  NameResolver2.start()
  //发消息
  NameResolver2!Net2("www.baidu.com",self)
  
  //接收消息
  println(self.receive{case msg => msg})
}
结果如下:

www.baidu.com/119.75.217.109
Some(www.baidu.com/119.75.217.109)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值