scala学习八:scala的actor
标签(空格分隔): scala
[Toc]
一,actor的创建和使用
import scala.actors._
//Actor是一个抽象类
class HiActor extends Actor{
def act():Unit ={
//处理消息
while(true){
receive{
case "hi" => println("hi actor")
case "hello" => println("hello actor")
}
}
}
}
object HiActor{
def main(args: Array[String]){
val actor1=new HiActor
actor1.start()
//! 方法名称
actor1 !"hi"
}
}
二,Actor的消息机制
import scala.actors._
case class MyMessage(inputdata:Int,outputChannel:OutputChannel[Int])
class MyComputer extends Actor{
def act():Unit ={
//处理消息
while(true){
receive{
case MyMessage(inputdata,outputChannel) =>{
val ret=inputdata*10
outputChannel !ret
}
}
}
}
}
object MyComputer{
def main(args: Array[String]){
val computor=new MyComputer
computor.start()
val channel=new Channel[Int]()
MyMessage msg=new MyMessage(10,channel)
computer ! msg
channel.receive{
case 110 =>println("the result is correct!")
}
}
}
三,同步消息和Future
同步消息
import scala.actors._
//Actor是一个抽象类
//处理同步消息的时候,处理方会返回一个结果给发送发
//同步消息会阻塞当前线程的执行,知道收到返回的结果
class HiActor extends Actor{
def act():Unit ={
//处理消息
while(true){
receive{
case "hi" => {
println("hi actor")
reply("success")
}
case "hello" => println("hello actor")
}
}
}
}
object HiActor{
def main(args: Array[String]){
val actor1=new HiActor
actor1.start()
//! 方法名称
val ret=actor1 !?"hi"
ret match{
case "success" =>{
println("success")
}
}
}
}
四,Actor使用最佳实践
1,避免使用公用状态:尽量不要使用对象以外的的数据
2,不要调用actor方法
3,保持每个actor的简单:actor尽量只做一件事,保持程序的简洁和高效
4,将上下文数据包含在消息中
5,最小化给发送方回复:减小网络开销
6,最小化阻塞调用
7,尽量使用react
8,建立失败区