




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 24 天多线程第 24 天授课内容1、线程的第一种实现方式(掌握)2、创建线程的第二种方式(掌握)3、获取线程的名字(会使用)4、多线程练习:模拟售票(课下多书写)5、多线程安全问题分析(了解)6、多线程安全问题的解决(掌握)7、同步中的细节(了解)8、单例中懒汉式的线程安全问题解决(掌握)9、同步方法及同步锁(掌握怎么去使用)10、同步的好处、弊端&线程状态(知道线程中的各种状态)11、多线程中的死锁(次重点)1、线程的第一种实现方式1.1创建线程的第案例:创建线程的第式式步骤:1,创建一个线程子类继承 Thread 类2,在创建的子类中重写 run 方法3,实例化子类对象,并调用 st
2、art()方法1.2继承 Thread 的原理问题:为什么要创建一个新的线程子类并继承 Thread 类?直接使用 Thread 去创建线程其实也是可以的,但是 Thread 类是 java 语言在设计时就已经存在的类了,类中相关功能都已经书写好了,而使用多线程想要执行的是自己书写的任务代码(而 Thread 类中任务代码却已经固定写好了,不能使用 Thread 中的代码),只能创建自己的线程类并继承 Thread 类重写 run 方法问题:为什么继承了 Thread 类后,一定要重写 run 方法?当线程开启之后(调用 start 方法),JVM 就会自动的把 run 方法加载到新开辟的运行
3、通道中执行(java 语言底层已经把 JVM 自动调用任务代码的功能固定死了)问题:为什么不直接去调用 run 方法,而是调用 start 方法?start()方法是用来开辟一个新的线程通道。如果没有执行 start 方法而是直接去执行 run()方法,进程中就没有新的运行通道,还是单线程在执行2、创建线程的第二种方式2.1实现 Runnable 接口创建线程第二种方式的步骤:1, 创建一个实现 Runnable 接口的子类2, 子类中重写 Runnable 接口中的 run 方法3, 实例化子类对象,并把子类对象作为参数传递给 Thread 对象4, 调用 Thread 对象中的 start
4、()方法案例:创建线程的第二种方式2.2实现 Runnable 接口的原理继承 Thread 类的弊端:1、 类和类之间只能单一继承,当继承 Thread 类后就不能再继承其它的类了。(单继承)2、 Thread 类属于线程类,按照面象的方式来讲,线程类就应该是操作线程功能的,但是 Thread 类除了可以操作线程的相关功能外,还可以执行任务代码。这种情况会让Thread 类的耦合度变高(耦合高问题)解决方案:不论是解决单一问题,还是解决耦合高,在 java 中都是使用接口(Runnable)Runnable 接口和 Thread 类的区别:Thread 类属于线程类,可以用来直接操作多线程。
5、Runnable 接口只把任务代码单独的代码,必须借助 Thread 类或其子类出来单独实现,任务功能。想要执行任务3、获取线程的名字在之前息。书写的代码中,为了区分主线开辟的线程,在输出时添加了不同的输出信其实在创建线程对象时,底层 JVM 已经给创建出来的线程起了名字。线程默认命名格式:Thread-xx 是一个数字,自动增长。从 0 开始案例:获取当前正在执行的线程名称注意:主线程的名称是:main在创建 Thread 对象时,其实也可以给创建的线程起个名字案例:创建线程对象时指定名称除了可以在创建线程对象时指定名称外,还可以在创建完线程之后,再给指定名称4、多线程练习:模拟售票场景:火
6、车站售票买火车票时,需要去窗口排队买票(售票窗口有多个),每个窗口都可以出售相同的火车票,如果同一个出售后,该票其它窗口就不能出售了案例:使用多线程模拟火车站售票窗口三个售票窗口:程序需要开辟 3 个新的线程通道三个售票窗口可以出售同一种票:3 个线程操作相同的数据三个售票窗口中出售了某一张票后,其它窗口不能再出售相同的票:3 个线程在操作时不能有相同的数据存在问题:main 表示的主线程运行完之后,是不是就表示整个程序结束了?不是。 主线程运行完了,不代表开辟其它线程也执行结束了。5、多线程安全问题分析出现相同车票的原因:一个线程在没有全部执行完任务代码后,就被 CPU 切换到其它的线程上,
7、造成了数据的不安全性(线程安全问题)6、多线程安全问题解决之前程序造成线程的不安全问题的原因:在操作共享数据时,共享数据还没有完全操作结束,当前线程就被 CPU 切换了。解决方案:不能控制 CPU,那么就只能让线程在操作共享数据时,务必保证某个线程在操作完共享数据之后,其它线程才可以继续操作共享数据java 提供了一种解决方案:同步代码块同步代码块的格式:synchronized(任意对象)/任意对象也称为对象锁/线程要操作的共享数据代码案例:使用同步代码块解决之程序中存在的线程不安全问题在向以上程序中添加同步代码块时,需要注意两个问题:1, synchronized 同步代码块只能添加到 w
8、hile 循环变成单线程代码了)。(如果添加到 while 循环外部,就2, 因为计算机性能问题,会出现瞬间一个线程卖完所有的票。(把出售的票数修改为较大的值)7、同步中的细节问题:对于多线程安全,使用同步代码块解决时,同步代码块应该添加在任务代码(run方法中书写的代码)中的什么位置?在开发中,同步代码块是添加在任务代码中操作共享数据的位置上。问题:在任务代码中已经添加了同步代码块,但是程序还存查问题呢?程安全问题,应该怎么去排步骤 1:先确定同步代码块是否添加在任务代码中的操作共享数据的位置上。如果共享数据的代码并没全部放置在同步代码块中,就需要修改同步代码块中包含的操作共享数据的代码步骤
9、 2:如果确定同步代码块是添加在操作共享数据的代码位置上,再去检查对象锁是否使用的是同一个对象锁。如果要不是使用同一个对象锁,也存数据不安全问题程中回顾:创建线程有两种方式:1,创建一个线程子类继承 Thread,重写 run 方法2,创建一个实现类实现 Runnable 接口,重写 run 方法多线程安全问题的产生:多个线程同时都操作相同的一个数据,造成数据的不安全性解决多线程安全问题的方案:在操作共享数据时,添加同步代码块同步的关键字:synchronized8、单例中懒汉式的线程安全问题单例模式(原子模式、单态模式):解决:保证所创建出来的对象是唯一的。怎么实现:1、构造方法;2、在类的
10、书写属于自己的本类对象3、对外提供一个方法,可以让其它程序属于本类的对象单例设计模式代码体现:案例:多线程实现单例模式代码以上程序上运行后,出现了两个 Single 对象,分析原因:了单例设计模式的原则。运行结果:解决方案:在操作共享数据的位置添加同步代码块代码实现:另一种写法:可以提供程序的执行效率9、同步方法及同步锁之前,遇到线程安全问题时,使用同步代码块解决。同步代码块格式:synchronized(任意对象)/操作共享数据的代码其实除了可以使用同步代码块解决线程安全问题外,还可以使用同步方法解决同步方法使用格式:(在方法上添加一个同步关键字)修饰符 synchronized返回值类型
11、函数名(参数列表)注意:同步方法分为静态同步方法和非静态同步方法案例:同步方法及同步方法上的对象锁修改程序:给方法添加同步关键字小结:当同步代码块想要和非静态同步方法保持共享数据一致(不出现线程安全问题),需要在同步代码块中使用同步方法上的锁:this 对象案例:静态同步方法上的对象锁修改程序:保证同步代码块和同步方法使用同一个对象锁小结:同步代码块想要和静态同步方法使用同一个对象锁,需要使用:类名.class补充:之前在讲集合时,ArrayList、LinkedLisshMap 这些集合都属于线程不安全的集合。当使用线程不安全的集合类时,就会出现线程不安全同元素或删除同一个相同元素解决方案:
12、使用 Collections 工具类中的方法:多个线程同一个相运行结果:修改程序:保证同步代码块和静态同步方法使用同一个对象锁10、同步的好处、弊端&线程状态同步的好处:解决了线程不安全问题(保证多个线程在操作共享数据不会出现不安全数据)同步的弊端:降低程序的执行效率(执行同步时每次都要判断是否有对象锁存在)线程的状态:11、多线程中的死锁死锁在开发中,也会遇到,当线程进入到死锁状态时,程序中线程就会一直处于等待状态。死锁的发生:举例:有两个线程(A 线程、B 线程),有两个对象锁(lock_A、lock_B)A 线程在执行时,先拿到 lock_A 对象锁(此时 lock_A 对象锁绑定在 A
13、 线程上),此时 CPU 切换到 B 线程上,B 线程拿到 lock_B 对象锁(此时 lock_B 对象锁绑定在 B 线程上),这时 CPU 又切换到 A 线程上,这时 A 线程需要拿 lock_B 对象锁,此时 A 线程获取不到 lock_B 对象锁(A 线程处于等待)。当CPU 切换到B 线程上,这时B 线程需要拿lock_A 对象锁,此时B 线程获取不到lock_A对象锁(B 线程处于等待)。案例:死锁的代码体现注意:在开发中一旦发生了死锁现象,不能通过程序自身解决。必须修改程序的源代码。在开发中,死锁现象可以避免,但不能直接解决。当程序中有多个线程时,并且多个线程需要通过嵌套对象锁(
14、在一个同步代码块中包含另一个同步代码块)的方式才可以操作代码,此时就容易出现死锁现象。可以使用一个同步代码块解决,不要使用嵌套的同步代码块,如果要使用嵌套的同步代码块,就要保证同步代码块的上的对象锁使用同一个对象锁(唯一的对象锁)12、生产者消费者分析&代码实现12.1生产者消费者分析通过之前的分析:同样一个资源,操作对象不同,就会出现不同的实现方式生产者:用来向共享的资源添加新商品。当生产者生产完商品后,就需要消费者来进行消费消费者:从共享的资源中获取商品。当消费者把商品消费完后,就需生产者进行新商品的生产分析:共同的资源:就是保存商品的容器。生产者:就是一个对象,同样也是一个线程。向容器中添加商品。当生产者添加完商品后(容器满了),就需要消费者来获取商品消费者:也是一个对象,也是一个线程。从容器中获取商品(获取的商品容
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 南昌大学《小学科学活动设计与指导》2023-2024学年第二学期期末试卷
- 杭州科技职业技术学院《旅行社经营实务》2023-2024学年第二学期期末试卷
- 新疆政法学院《复合材料力学》2023-2024学年第二学期期末试卷
- 哈尔滨幼儿师范高等专科学校《能源动力(动力工程)领域工程伦理》2023-2024学年第二学期期末试卷
- Starter Unit 1 Section B 1a-1e 教学设计 2024-2025学年人教版英语七年级上册
- Unit 2 What time is it Part A Let's learn(教学设计)-2023-2024学年人教PEP版英语四年级下册
- 常州幼儿师范高等专科学校《医学遗传学基础》2023-2024学年第二学期期末试卷
- Unit 6 My week Lesson 2 Activities in a week(教学设计)-2024-2025学年人教新起点版英语二年级下册
- 沧州2025年河北沧州市人民医院第一批招聘119人笔试历年参考题库附带答案详解
- ★试题:决策过程及其思维特点、科学决策与科学思维的关系
- WS 400-2023 血液运输标准
- 银行业金融机构监管数据标准化规范(2021版)数据结构一览表
- 电子商务基础与实务(第四版)高职PPT完整全套教学课件
- 信息论与编码(第4版)完整全套课件
- 施工吊篮工程监理实施细则
- 自动扶梯与自动人行道调试作业指导书(通用版)
- 2023年全国卷英语甲卷讲评课件-2024届高考英语复习
- 现代通信原理与技术(第五版)PPT全套完整教学课件
- 《战胜抑郁 走出抑郁症的30天自我康复训练》读书笔记思维导图
- 幼儿园课件:时钟国王
- 最值问题-阿氏圆
评论
0/150
提交评论