! | 发送异步消息,没有返回值 |
---|---|
!? | 发送同步消息,等待返回值 |
!! | 发送异步消息,返回值是Future[Any] |
actor1 ! "要发送的消息"
接收信息
Actor中使用receive方法来接收消息,需要给receive方法传入一个偏函数
receive方法只接收一次消息,接收完后继续执行act方法
{
case 变量名1:消息类型1 => 业务处理1,
case 变量名2:消息类型2 => 业务处理2,
...
}
import scala.actors.Actor
import scala.actors.threadpool.TimeUnit
object Test03 {
//创建两个Actor(ActorSender、ActorReceiver)
//ActorSender发送一个异步字符串消息给ActorReceiver
object 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.Actor
object Test04 {
//创建两个Actor(ActorSender、ActorReceiver)
//ActorSender发送一个异步字符串消息给ActorReceiver
object 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()
}
}