scala actor
scala使用不变对象,在并发编程中,不同的线程通过消息的方式(传递不变对象)进行线程间通信。由于对象的不变性,不需要对对象状态进行同步以免数据竞争,不需要对方法进行同步,不用担心涉及多个调用的方法在多线程中被其他线程竞争先调用其中的部分调用。
在java并发模型中,我们需要关注共享的数据结构,而使用Scala则需要关注操作数据的代码结构,因为对象都是不变的。
在actor之间进行消息的传递:
def main(args: Array[String]) {
//新建一个actor
val mine = Actor.self;
//也是创建一个新的actor发送消息
// mine ! "hello" 放入另外一个actor里面执行
Actor.actor {
mine ! "hello"
}
// 消息发送者接受消息 用mine.receive也可以的
Actor.receive {
case a: String => println(a + " world")
case _ =>
}
}
actor之间进行消息的传递,使用actor的!()方法,这个方法是异步的,如果需要同步的话需要使用!?() 方法,发送actor会一直阻塞到接受消息的actor给出回应消息被他接受到之时,这个方法比较危险,如果响应actor没有给出响应或者传递响应出现异常,那么等待的actor一直阻塞在那里,避免此问题的方式是使用带超时的方法。
def main(args: Array[String]) {
val one = Actor.actor {
while (true) {
Thread sleep (1000)
Actor.receive {
case "exit" => println("exit"); Actor.exit
case _ => Actor.sender ! "response"
}
}
}
//返回值Some(response)
println(one !? (2000, "abc"))
//返回值 None
println(one !? (500, "efg"))
println(one !? "exit")
}
scala中Actor是个trait,类似java的接口,需要就可以混入他,如:
class Abc extends Actor{
def act(){}
}
object Abcs extends Actor{
def act(){}
}
这样可以显示的控制actor的启动:Actor.start().
receive和receiveWithin方法返回一个处理消息的应答,前者是个阻塞的方法,直到受到应答为止,后者可以有个超时的时间
react和reactWhitin:receive系列方法在被调用的时候,会独占一个单独的线程,这个线程被一直持有,到actor结束
react系列方法不会,在他被调用完之后,立即释放线程返回给线程池,到第二次被调用的时候再从线程池中随机选取一个线程执行,也就是说这个方法和线程是隔离的,任何的线程都可以执行他。

浙公网安备 33010602011771号