scala Actor 初探

来源:互联网 发布:sql注入攻击实例 编辑:程序博客网 时间:2024/05/16 12:22

scala提供两种Actor:基于线程的Actor和基于事件的Actor。

一、基于线程的Actor

1、每个基于线程的Actor运行在自己的JVM线程中,它们被java线程调度器调度,是一个可抢占的优先级调度器。这种Actor使用receive模型,它从线程池获取一个线程后一直使用。

2、实现方法:基于线程的Actor的实现方法是继承scala.actors.Actor,完成其act方法,并通过start方法来启动它:

import scala.actors.Actorobject HiActor extends Actor {  def act() {    while(true) {      receive {        case "EXIT" => println("Exiting...");exit()        case msg => println("Hello " + msg)      }    }  }}HiActor.start          // 使用start方法启动ActorHiActor ! "def"HiActor ! "EXIT"</span>

二、基于事件的Actor

1、基于事件的Actor不会为每个Actor分配线程,它们运行一个线程上。一个Actor在一个线程上运行完成后,该线程可供其它Actor使用。

2、实现方法:使用scala.actors.Actor类的actor方法来创建Actor。 Actor在定义后完成后立即启动,无须另外调用start()访求进行启动。

import scala.actors._, Actor._val badActor = actor{    loop {      receive {        case "EXIT" => println("Exiting...");exit()        case msg => System.out.println(msg)      }    }}badActor ! "hello scala!!"         // 无须调用start方法badActor ! "EXIT"badActor ! "HI scala!!"</span>

Actor是构建在普通java线程之上的,每个actor都必须得到自己的线程,这样每个act方法才能有机会运行。但是线程会消耗内存,当许多Actor开始执行时,可能会造成内存不足。而scala为了节约线程,提供一个叫做react的方法。react带一个偏函数,scala执行完react方法后抛出异常,然后这个线程就可以被其它Actor使用。

如下是上面两个示例的react实现:

import scala.actors._object SeriousActor extends Actor {  def act() {    loop {      react {        case (name:String, actor: Actor) => actor ! "Hi man!!!"        case msg => println("Unhandled message: " + msg)      }  }}

import scala.actors._, Actor._val badActor = actor{    loop {      react {        case "EXIT" => println("Exiting...");exit()        case msg => System.out.println(msg)      }    }}badActor ! "hello scala!!"badActor ! "EXIT"badActor ! "HI scala!!"



0 0
原创粉丝点击