Scala Actor并发编程

Scala中的并发编程采用Actor模型,通过消息传递而非共享资源避免了Java中可能出现的死锁问题。Actor初识中,我们可以利用scala.actors.Actor._创建Actor对象,结合case class进行消息接收,实现高效并发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    Java中的并发编程主要通过线程实现的,通过共享资源的机制实现并发,但会面临着死锁的问题。在Scala中,是通过消息传递来实现并发的,而Actor正是实现消息传递的。

1、Actor初识

package com.yy.enhance

import scala.actors.Actor

/**
 * Scala Actor并发编程
 * 初识Actor
 */
object MyActor1 extends Actor{
  //重新act方法
  def act(){
    for(i <- 1 to 10){
      println("actor1_ " + i)
      Thread.sleep(2000)
    }
  }
}

object MyActor2 extends Actor{
  //重新act方法
  def act(){
    for(i <- 1 to 10){
      println("actor2_ " + i)
      Thread.sleep(2000)
    }
  }
}

object ActorTest extends App {
  
  //启动Actor
  MyActor1.start()
  MyActor2.start()
}
结果如下:

actor1_ 1
actor2_ 1
actor1_ 2
actor2_ 2
actor1_ 3
actor2_ 3
actor1_ 4
actor2_ 4
actor2_ 5
actor1_ 5
actor2_ 6
actor1_ 6
actor2_ 7
actor1_ 7
actor2_ 8
actor1_ 8
actor2_ 9
actor1_ 9
actor2_ 10
actor1_ 10

2、Actor消息传递

package com.yy.enhance

import scala.actors.Actor

/**
 * Actor 消息传递
 * 
 */
class MyActorForMsg extends Actor{
  //实现act方法
  def act(){
    while(true){
      //receive从邮箱中获取一条消息
      //传递给它的函数(如下面case块,执行时转换为一个偏函数)
      receive{
        case "my_msg" => println("received the msg:" )
        case _ => println("Not received the correct msg.")
      }
    }
  }
}
object ActorTest2 extends App {
  
  val actor = new MyActorForMsg()
  //启动Actor
  actor.start()
  //发送消息--正确消息
  actor!"my_msg"
   //发送消息--非正确消息
  actor!"not_my_msg"
}
结果如下:

received the msg:
Not received the correct msg.

3、匿名Actor

      使用scala.actors.Actor._提供的actor工具方法可以方便的创建Actor对象,如下:

package com.yy.enhance

//提供了actor方法
import scala.actors.Actor._
/**
 * 匿名Actor
 */
object ActorTest3 extends App {
  //创建Actor对象
  val actor_msg = actor{
    while(true){
      receive{
        case msg => println("Msg from MailBox:" + msg)
      }
    }
  }
   //创建Actor对象
   val actor_Int = actor{
     while(true){
       receive{
           case msg:Int => println("the Int Number from MailBox:" + msg)
           case _ => println("Not a Int Number")
       }
     }
   }
   
   //发送消息
   actor_msg!"mmmm"
   actor_Int!10
   actor_Int!"22"
}
结果如下:

the Int Number from MailBox:10
Not a Int Number
Msg from MailBox:mmmm

4、Actor 和case class 以及消息接收

package com.yy.enhance

import scala.actors.Actor
import actors._, Actor._
/**
 * Actor with Case Class
 * 
 */
case class Emp(val name:String, val age:Int)

//Actor
class MyActor extends Actor{
  //重写act方法
  def act(){
     while(true){
       receive {
         case Emp(name,age) =>{
            println("Emp name:" + name + ",age:" + age)
            //给消息发送者回复消息
            sender!"well done,Boy!"
         }
       }
     }
  }
}

object ActorWithCaseClassTest  extends App{
  val myActor = new MyActor
  //启动
  myActor.start()
  //发送消息
  myActor!Emp("yy",25)
  
  //接收回传消息
  self.receive{
    case msg => println(msg)
  }
}
结果如下:

Emp name:yy,age:25
well done,Boy!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值