scala进阶22-并发编程react、loop

import java.net.{InetAddress, UnknownHostException}

import scala.actors.Actor
import scala.actors.Actor._

/**
  * 1、在Actor类的act方法中,可以使用react方法来替代receive方法进行消息的处理,
  * 使用react方法的好处是可以在一个线程中执行多个Actor的消息处理函数,
  * 需要注意的是当react方法接受到的消息匹配到它方法体中的一个偏函数时并进行消息的
  * 处理后会导致该react方法的退出,这时一般常常在react方法中每个偏函数的最后一行加上
  * act()方法 使得react方法可以重新关联Actor的邮箱。
  *
  *(2)由于让消息处理器中的每个偏函数末行加上一个act()方法来负责保持循环继续下去是
  * 一件很麻烦且很不公平的事情,Scala语言提供了loop组合子来简化这个问题,在Actor的
  * act()方法和react方法之间使用loop组合子可以生成一个无限的循环,如果想给循环加上一个条件,
  * 可以把loop换成loopWhile,然后在其后面加上条件判断语句。
  */
object NameResolver extends Actor {
  def act() {
    /**
      * 用react方法来替代receive方法进行消息的处理,react允许共享线程资料,
      * react方法匹配一次并执行完成,然后会退出, 通过再次调用act()方法来重新关联Actor的邮箱。
      */
//    react {
//      case Net(name, actor) =>
//        sender ! getIp(name)
//        act //通过调用继续处理邮箱信息
//      case "EXIT" => println("Name resolver exiting")
//      case msg =>
//        println("Unhandled message: " + msg)
//        act
//    }

    loop { //loop可以循环调用react来处理邮箱的信息
      react {
        case Net(name, actor) =>
          sender ! getIp(name)
        case msg =>
          println("Unhandled message: " + msg)
      }
    }
  }

  def getIp(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 Actor_More_Effective {
  def main(args: Array[String]): Unit = {
    NameResolver.start()
    NameResolver ! Net("www.baidu.com", self)

    println {
      self.receiveWithin(1000) {
        case x => x 
      }
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值