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
}
}
}
}
scala进阶22-并发编程react、loop
最新推荐文章于 2025-04-06 10:13:06 发布