大数据系列修炼-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
如有问题,欢迎留言指正!
- 大数据系列修炼-Scala课程66
- 大数据系列修炼-Scala课程01
- 大数据系列修炼-Scala课程02
- 大数据系列修炼-Scala课程03
- 大数据系列修炼-Scala课程04
- 大数据系列修炼-Scala课程05
- 大数据系列修炼-Scala课程06
- 大数据系列修炼-Scala课程07
- 大数据系列修炼-Scala课程08
- 大数据系列修炼-Scala课程09
- 大数据系列修炼-Scala课程10
- 大数据系列修炼-Scala课程11
- 大数据系列修炼-Scala课程12
- 大数据系列修炼-Scala课程15
- 大数据系列修炼-Scala课程17
- 大数据系列修炼-Scala课程18
- 大数据系列修炼-Scala课程19
- 大数据系列修炼-Scala课程20
- JAVA基础再回首(二十九)——TCP传输、上传文件、上传图片、多并发上传
- java日期操作——Date、SimpleDateFormat、Calendar
- leetcode 题解 3. Longest Substring Without Repeating Characters
- 线性dp顺序对齐
- 【C++研发面试笔记】6. 基本数据结构-数组
- 大数据系列修炼-Scala课程66
- 51nod 1083 矩阵取数问题
- 203. Remove Linked List Elements
- linux基础命令
- 最速下降法和牛顿方法的Python实现和MATLAB实现
- java常量池概念
- mvc之composer加载和model数据类
- Eclipse 自动填充设置
- android进度条seekbar自定义样式