大数据系列修炼-Scala课程66

来源:互联网 发布:java变量初始化顺序 编辑:程序博客网 时间:2024/05/16 07:21

大数据系列修炼-Scala课程66


核心内容:
1、Java中的并发编程
2、Scala并发编程实战初体验


1、Java并发编程的问题

1、Java中的并发编程基本上满足了事件之间相互独立,但是事件能够同时发生的场景的需要。
2、Java中的并发编程是基于共享数据和加锁的一种机制,即会有一个共享的数据,然后有若干个线程去访问这个共享的数据(主要是对
共享的数据进行修改),同时Java利用这种加锁的机制(synchronized)来确保同一时间只有一个线程对我们的共享数据进行访问。
3、线程本身是一个动态的概念,因此Java中的线程测试是不可靠的。
4、Java中的并发编程实现是基于共享数据和加锁的一种机制,存在资源争夺和死锁等多种情况,因此程序越大问题越麻烦。


实例程序1:Java中两种创建线程的方式

public class App1{     public static void main(String[] args) throws InterruptedException   {      A  aa = new A();      Thread bb = new Thread(new B());      aa.start();      bb.start();   }    }class A extends Thread  //方式1:继承Thread类,并重写run方法{   @Override   public void run()   {      for(int i=0;i<=10;i++)      {          System.out.println("Step:"+i);          try          {            Thread.sleep(2000);          } catch (Exception e){}      }   }}class B implements Runnable{   public void run()   {      for(int i=0;i<=10;i++)      {          System.out.println("StepFuthur:"+i);          try          {            Thread.sleep(2000);          } catch (Exception e){}      }    }}

运行结果:

Step:0StepFuthur:0StepFuthur:1Step:1Step:2StepFuthur:2StepFuthur:3Step:3StepFuthur:4Step:4StepFuthur:5Step:5StepFuthur:6Step:6StepFuthur:7Step:7StepFuthur:8Step:8StepFuthur:9Step:9StepFuthur:10Step:10

在上面的程序中,两个线程同时执行,所谓同时执行就是交替的执行,也就是两个程序不停的占用CPU交替的进行执行。

2、Scala并发编程实战初体验

1、Java的并发编程思想与Scala的并发编程思想:
①Java中的并发编程是基于共享数据和加锁的一种机制,即会有一个共享的数据,然后有若干个线程去访问这个共享的数据(主要是对共享的数据进行修改),同时Java利用加锁的机制(即synchronized)来确保同一时间只有一个线程对我们的共享数据进行访问,进而避免共享数据的操作不一致性。
②Scala中的并发编程思想与Java中的并发编程思想实现完全不一样,Scala中的Actor是一种不共享数据,依赖于消息传递的一种并发编程模式, 避免了死锁、资源争夺等情况:在实现的过程中,Scala中的Actor会不断的循环自己的邮箱,当有消息传递过来的时候,receive这个偏函数就会进行消息的模式匹配并进行相应的处理。
2、Scala中Actor机制:如果Actor A和 Actor B要相互沟通的话,A要给B传递一个消息,B会有一个收件箱,然后B会不断的循环自己的收件箱,
若看见A发过来的消息,B就会解析A的消息并执行,处理完之后就有可能将处理的结果通过邮件发送给A,在执行过程中B会修改自己的状态。
3、Spark不同组件之间的通信大部分都是通过Akka的方式,而Akka是基于Scala中的Actor。
4、Scala中创建线程的方式:继承Actor类,并重写act方法。

实例程序1:Scala中创建线程的方式

//Actor最原始的一种使用方式 class A extends Actor  //继承Actor类,并重写act方法{   override def act()=   {     for(i<- 1 to 10)     {        println("Step:"+i)        Thread.sleep(2000)     }   }}class B extends Actor{   override def act()=   {      for(i<- 1 to 10)      {         println("StepFuther:"+i)         Thread.sleep(2000)      }   }}object App1 {   def main(args:Array[String]):Unit=   {       val aa = new A()      val bb = new B()      aa.start()      bb.start()   }}

运行结果:

Step:0StepFuthur:0StepFuthur:1Step:1Step:2StepFuthur:2StepFuthur:3Step:3StepFuthur:4Step:4StepFuthur:5Step:5StepFuthur:6Step:6StepFuthur:7Step:7StepFuthur:8Step:8StepFuthur:9Step:9StepFuthur:10Step:10

如有问题,欢迎留言指正!

1 0