今天在这里跟大家分享下王家林老师讲的scala编程中的actor的并发编程。
在java中,同时进行一个操作的时候,java会先把共享数据锁死,从而避免不同的操作来同时操作一个数据,这个就形成了资源调度的问题,而且如果用不好,还会造成死锁。而在scala中,通过类似消息的发送和接收的队列的方式,来访问同一个共享数据,这样一来,当轮到一个操作来访问某个数据的时候,不会发生另一个操作也同时访问的该数据的情况,这样就避免了资源争用的问题及死锁的发生。下面我们通过一个小小的实例来看看scala是怎样通过actor来实现并发的。
package scala.learn
import scala.actors.Actor
object First_Actor extends Actor{//定义第一个Actor
def act(){
println(Thread.currentThread().getName) //打印第一个Actor线程名
for(i<- 1 to 10){
println("Step:" + i)//依次打印1到10
Thread.sleep(2000)
}
}
}
object Second_Actor extends Actor{//定义第一个Actor
def act(){
println(Thread.currentThread().getName)//打印第二个Actor线程名
for(i<- 1 to 10){
println("Step_Second:" + i)//依次打印1到10
Thread.sleep(2000)
}
}
}
object testactor{
def main(args: Array[String]){
First_Actor.start()//启动第一个Actor
Second_Actor.start()//启动第二个Actor
}
}
代码中关键地方我都给出了注释,让我们来看看程序的运行结果:
ForkJoinPool-1-worker-13
ForkJoinPool-1-worker-11
Step:1
Step_Second:1
Step_Second:2
Step:2
Step_Second:3
Step:3
Step_Second:4
Step:4
Step:5
Step_Second:5
Step:6
Step_Second:6
Step:7
Step_Second:7
Step:8
Step_Second:8
Step:9
Step_Second:9
Step:10
Step_Second:10
我们可以发现,程序的两个不同的actor是占用了两个不同的线程运行的。
王家林亲授《DT大数据梦工厂》大数据实战视频“Scala深入浅出实战经典”视频、音频和PPT下载!第66讲:Scala并发编程实战初体验及其在Spark源码中的应用解析
百度云:http://pan.baidu.com/s/1pJ5jzHx
腾讯微云:http://url.cn/aSawrm
360云盘:http://yunpan.cn/cctL3QYACaVNa 访问密码 c0fb
信息来源于 DT大数据梦工厂微信公众账号:DT_Spark