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,建立失敗區