scala并发编程

来源:互联网 发布:java并发编程书籍 编辑:程序博客网 时间:2024/05/19 00:42

并发编程的优点和风险
http://blog.csdn.net/jiyiqinlovexx/article/details/51002504
从scala2.10开始Actor模块已被移除,应使用Akka框架中的Actor
http://akka.io/try-akka/
Actor可以看作一个个独立的实体,之间毫无关联,通过消息通信,消息可以是任何类型,内容也可以是任意的,
Actor提供了一种不共享任何数据、依赖消息传递。类似于·线程的实体,有一个用来接收消息的邮箱。在并发编程中,Actor相对与使用共享数据和锁模型的实现,推断和使用更容易。
1、 Actor的构建方式
1) 继承Actor类
继承Actor类,重写act方法,

object Demo extends Actor{def act():Unit={println(“HelloActor!”)//Actor启动act方法,}def main(args:Array[String])={Demo.start()}}

2)Actor工具方法

import scala.actors.Actor._object Demo{def main(args:Array[String]){val myActor=actor{println(“hello Actor!”)}}}

2、 Actor的生命周期
start方法的等幂性
Reactor是所有Actor trait 的父级trait,扩展这个trait可以定义Actor,其具有发送和接收信息的基本功能,Reactor的行为通过其act方法来定义,调用start方法启用Reactor,act方法便执行,start方法返回Reactor对象本身,
在一个已经启动的Actor对象调用start是没用的。

object Test extends Actor{def main(args:Array[String]){println(Test.getState)Test.start()Test.start()Thread.sleep(5000)println(Test.getState)Test.restart()}def act(){println(Test.getState)println(“act is excuted”)}}

输出是

NewRunnableact is excutedTerminatedRunableact is excuted

Actor的不同状态,getState()
New 尚未运行的Actor
Runnable 能够运行且不再等待消息的Actor
Suspended已挂起等待消息
Terminated已终止

Actor的生命周期
start方法 doStart方法 preAct方法 act方法 exit()自然退出

restart()重新启动

4、 Actor之间的通信
1、 Tip1:
Actor可以构造成带有指向一个或更多actor的引用。
2、 Tip2:
Actor可以接受带有指向另一个actor的引用的消息,在请求中提供一个actor引用非常常见。
3、 Tip3:
Actor可以返回消息给发送方。Receive会把sender字段设为当前消息的发送方。

使用val fut=a!!Msg语句发送信息,立即返回一个Future实例
HelloActor!”hello”,向HelloActor的信箱发送信息,HelloActor的receive方法通过PartialFunction偏函数匹配信息类型。
Future可以在不都塞的情况下可以通过isSet()查询并获知结果是否可用,
Send-With-Future的消息并不是获得Future的唯一方法,Future也可以通过future方法计算。
!?方式,线程将堵塞指定结果返回

import actors._,Actor._object DealMessage{def main(args:Array[String]){val caller=selfval accumulator=actor{var continue=truevar sum=0loopWhile(continue){reactWhile(10000){case number:Int=>sum+=numbercase TIMEOUT= //超时continue=falsecaller!sum//向调用方发回计算结果}}}accumulator!2Thread.sleep(5000)accumulator!”hello”Thread.sleep(5000)accumulator!9receiveWithin(60000){//设置超时时间60scase result=>println(“result is:”+result)}}}

5、 使用react重用线程提升性能
react是偏函数,找到并处理信息后并不返回,返回Nothing

object Demo extends Actor{def act()={react{case (num:Int,actor:Actor)=>actor!num*numcase msg=>println(“not a Integer”)}}def main(args:Array[String]){Demo.startDemo!(7,self)self.receive{case msg=>println(“收到结果:“+msg)}}}

6、 Channel通道
某个实体的连接通道,通过Channel可以执行不同的I/O操作
OutputChannel发送信息
1) out!msg 异步地向out方法发送msg,可以传送actor的引用
2) out forward msg 异步,发送msg给一个actor时,发送中的actor会被确定
3) out.receiver 返回唯一的actor,其接受发送到out channel 的消息
4) out.send(msg,from) from发送msg到out
InputChannel接收信息
1) in.receive{case Pat1=>…;case Patn=>…}
2) in.rreact{case Pat1=>…;case Patn=>…}
创建和共享Channel

import scala.actora.{Channel,OutputChannel}import scala.actors.Actor._object Demo{def main(args:Array[String]){actor{var out:OutputChannel[String=nullval channel=new Channel[String]//actor中定义一个channelout=channelval child=actor{react{case msg:String=>out!msg}}child!”hello World”channel.receive{case msg=>println(“msg.length:”+msg.length)}}}}

7、 同步和Future
!方法发送完后就不管,
!!发送完就返回一个Future对象,占位符
!?发送后等待

编程实例:
http://blog.csdn.net/yyywyr/article/details/50465411

原创粉丝点击