! | 发送异步消息,没有返回值。 |
!? | 发送同步消息,等待返回值。 |
!! | 发送异步消息,返回值是 Future[Any]。 |
actor 例子 Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃
package cn.itcast.actor
//注意导包是scala.actors.Actor
import scala.actors.Actor
object MyActor1 extends Actor{
//重新act方法
def act(){
for(i <- 1 to 10){
println("actor-1 " + i)
}
}
}
object MyActor2 extends Actor{
//重新act方法
def act(){
for(i <- 1 to 10){
println("actor-2 " + i)
}
}
}
object ActorTest extends App{
//启动Actor
MyActor1.start()
MyActor2.start()
}
一直接收信息
package cn.itcast.actor
import scala.actors.Actor
class MyActor extends Actor {
override def act(): Unit = {
while (true) {
receive {
case "start" => {
println("starting ...")
}
case "stop" => {
println("stopping ...")
}
}
}
}
}
object MyActor {
def main(args: Array[String]) {
val actor = new MyActor
actor.start()
actor ! "start"
actor ! "stop"
println("消息发送完成!")
}
}
react方式会复用线程,比receive更高效,react 如果要反复执行消息处理,react外层要用loop,不能用while
package cn.itcast.actor
import scala.actors.Actor
class YourActor extends Actor {
override def act(): Unit = {
loop {
react {
case "start" => {
println("starting ...")
}
case "stop" => {
println("stopping ...")
}
}
}
}
}
object YourActor {
def main(args: Array[String]) {
val actor = new YourActor
actor.start()
actor ! "start"
actor ! "stop"
println("消息发送完成!")
}
}
使用case class发送消息
package cn.itcast.actor
package cn.itcast.actor
import scala.actors.Actor
class AppleActor extends Actor {
def act(): Unit = {
while (true) {
receive {
case "start" => println("starting ...")
case SyncMsg(id, msg) => {
println(id + ",sync " + msg)
sender ! ReplyMsg(3,"finished")
}
case AsyncMsg(id, msg) => {
println(id + ",async " + msg)
}
}
}
}
}
object AppleActor {
def main(args: Array[String]) {
val a = new AppleActor
a.start()
//异步消息
a ! AsyncMsg(1, "hello actor")
println("异步消息发送完成")
//同步消息
//val content = a.!?(1000, SyncMsg(2, "hello actor"))
//println(content)
val reply = a !! SyncMsg(2, "hello actor")
println(reply.isSet)
//println("123")
val c = reply.apply()
println(reply.isSet)
println(c)
}
}
case class SyncMsg(id : Int, msg: String)
case class AsyncMsg(id : Int, msg: String)
case class ReplyMsg(id : Int, msg: String)