| ! | 发送异步消息,没有返回值 |
|---|---|
| !? | 发送同步消息,等待返回值 |
| !! | 发送异步消息,返回值是Future[Any] |
actor1 ! "要发送的消息"
接收信息
Actor中使用receive方法来接收消息,需要给receive方法传入一个偏函数
receive方法只接收一次消息,接收完后继续执行act方法
{case 变量名1:消息类型1 => 业务处理1,case 变量名2:消息类型2 => 业务处理2,...}
import scala.actors.Actorimport scala.actors.threadpool.TimeUnitobject Test03 {//创建两个Actor(ActorSender、ActorReceiver)//ActorSender发送一个异步字符串消息给ActorReceiverobject ActorSender extends Actor {override def act(): Unit = {//持续发送信息while (true){ActorReceiver ! "hello"//发送信息后程序停止3秒TimeUnit.SECONDS.sleep(3)}}}object ActorReceiver extends Actor {override def act(): Unit = {//持续接收消息while (true) {//ActorReceive接收到该消息后,打印出来receive {case msg:String => println("接收到的消息:" + msg)}}}}def main(args: Array[String]): Unit = {//调用ActorReceiver.start()ActorSender.start()}}
持续接收消息
上述代码示例中,使用while(true) 构建一个死循环来接收信息
- 如果当前Actor没有接收到消息,线程就会处于阻塞状态
- 如果有很多的Actor,就有可能会导致很多线程都是处于阻塞状态>
- 每次有新的消息来时,重新创建线程来处理
- 频繁的线程创建、销毁和切换,会影响运行效率
在scala中,可以使用loop + react来复用线程。比while + receive更高效
//持续接收消息loop {react {case msg: String => println("接收到的消息:" + msg)}}
import scala.actors.Actorobject Test04 {//创建两个Actor(ActorSender、ActorReceiver)//ActorSender发送一个异步字符串消息给ActorReceiverobject ActorSender extends Actor {override def act(): Unit = {//发送信息while (true) {ActorReceiver ! "hello"TimeUnit.SECONDS.sleep(3)}}}object ActorReceiver extends Actor {override def act(): Unit = {//持续接收消息 优化loop {react {case msg: String => println("接收到的消息:" + msg)}}}}def main(args: Array[String]): Unit = {//调用ActorReceiver.start()ActorSender.start()}}
