scala学习八:scala的actor

scala学习八:scala的actor

标签(空格分隔): scala


[Toc]

一,actor的创建和使用

001.PNG-60.9kB

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的消息机制

001.PNG-29.4kB


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")
            }
        }
    }
}

001.PNG-20.4kB

四,Actor使用最佳实践

1,避免使用公用状态:尽量不要使用对象以外的的数据
2,不要调用actor方法
3,保持每个actor的简单:actor尽量只做一件事,保持程序的简洁和高效
4,将上下文数据包含在消息中
5,最小化给发送方回复:减小网络开销
6,最小化阻塞调用
7,尽量使用react
8,建立失败区

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章