




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章多线程2不愤不启,不悱不发。不愤不启,不悱不发。举一隅而不以三隅反,则不复也。举一隅而不以三隅反,则不复也。3讨论正方:选择越多越幸福反方:选择越多越痛苦4回顾与作业点评请描述什么是请描述什么是JavaJava反射机制反射机制?请介绍获取请介绍获取ClassClass类有哪几种方法类有哪几种方法?在前一章中我们重点介绍了哪几个类?在前一章中我们重点介绍了哪几个类?5预习检查 检查是否画出本章思维导图。 什么是进程?什么是线程? 线程有几种状态?内容进度多线程创建和使用线程线程控制共享数据线程死锁和协作6什么是线程 线程可以称为轻量级进程,它和进程一样拥有独立的执行路径。线程和进程的区别在
2、于,线程存在于进程中,拥有独立的执行堆栈和程序计数器,没有独立的存储空间,而是和所属进程中的其它线程共享存储空间。 程序和进程的关系,可以理解为:程序是一段静态的代码,是应用程序执行的蓝本,而进程是指一种正在运行的程序,在内存中运行,有独立的地址空间。7线程的特点8多线程 传统的程序,一个进程里只有一个线程,所以也称为单线程程序,而多线程程序是一个进程里拥有多个线程910进程和线程的关系每个家庭成员每个家庭成员-线程线程家庭成员共同拥有-资源 家庭家庭 - -进程进程进程与线程 进程的缺点:CPU每调度一个进程,都要将其上次被执行的情况恢复到CPU和寄存器中去,由于每个进程都有自己的数据段、栈
3、段和代码段,这样的恢复现场工作需要占用大量系统资源。在多任务操作系统,会周期性地将CPU时间划分给每个进程,使操作系统得以同时执行一个以上的进程(或说程序),并让每个进程都像独立运行一样。 线程的优点:线程是一种轻量级的进程,他是一个程序中实现单一功能的一个指令序列,他是一个进程的一部分,不能单独运行,它必须在一个进程之内运行或者说是在一个程序的环境中运行。1112线程的基本状态及转换图时间片用光131、下列说法中错误的一项是( ) A.线程就是程序 B.线程是一个程序的单个执行流 C.多线程是指一个程序的多个执行流 D.线程用于实现并发2、下列说法中错误的一项是( ) A.Java中的第一个
4、线程都属于某个线程组 B.线程只能在其创建时设置所属的线程组 C.线程创建之后,可以从一个线程组转移到另一个线程组 D.新建的线程默认情况下属于其父线程所属的线程组3、下列说法中错误的一项是( ) A、线程是进程的执行单元 B、一个进程允许有多个线程,而一个线程至少有一个父进程 C、一个线程可以和删除另外一个线程 D、同一个进程中的不同线程之间不能并发执行课堂小结ACD现场提问:内容进度多线程创建和使用线程线程控制共享数据线程死锁和协作14创建和启动线程 创建线程有两种方式:扩展java.lang.Thread实现java.lang.Runnable接口方式方式1 1:扩展:扩展java.la
5、ng.Threadjava.lang.Threadclass class 类名类名 extends Thread extends Thread/属性/其他方法public void run()/线程需要执行的核心代码方式方式2 2:实现:实现java.lang.Runnablejava.lang.Runnable接口接口class class 类名类名 implements Runnable implements Runnable/属性/其他方法public void run()/线程需要执行的核心代码 15多线程的使用16 使用线程的步骤:定义一个线程创建线程的实例启动线程终止线程多线程的使
6、用public class TestThread public static void main(String args) throws InterruptedException Thread t1 = new MyThread1();MyThread2 mt2 = new MyThread2();Thread t2 = new Thread(mt2);t1.start();t2.start();/继承自Thread类创建线程类class MyThread1 extends Thread private int i = 0; /无参构造方法,调用父类构造方法设置线程名称 public MyTh
7、read1() super(我的线程1); /通过循环判断,输出10次,每次间隔0.5秒 public void run() try while(i 10) System.out.println(this.getName() + 运行第 + (i+1) + 次); i+; /在指定的毫秒数内让当前正在执行的线程休眠(暂停执行) sleep(500); catch(Exception e) e.printStackTrace(); /实现Runnable接口创建线程类class MyThread2 implements RunnableString name = 我的线程2;public voi
8、d run() System.out.println();线程睡眠,让出CPU执行时间实现Runnable接口中的方法17课堂练习00:30318案例描述案例描述: : 通过Thread实现线程;效果图效果图: :K练习内容练习时间:15分钟K=案例案例一一19案例描述案例描述: :通过Runnable实现线程;效果图效果图: :K练习内容练习时间:15分钟K=案例案例二二20共性问题解决21 常见调试问题及解决办法 代码规范问题共性问题221、下列说法中错误的一项是( )A.一个线程是一个Thread类的实例B.线程从传递给纯种的Runnable实例run()方法开始执行C
9、.线程操作的数据来自Runnable实例D.新建的线程调用start()方法就能立即进入运行状态 2、下列关于Thread类提供的线程控制方法的说法中,错误的一项是( )A.在线程A中执行线程B的join()方法,则线程A等待直到B执行完成B.线程A通过调用interrupt()方法来中断其阻塞状态C.若线程A调用方法isAlive()返回值为true,则说明A正在执行中D.currentThread()方法返回当前线程的引用课堂小结DD现场提问:内容进度多线程创建和使用线程线程控制共享数据线程死锁和协作23线程的控制 线程控制的方法: void start():使该线程开始启动,Java 虚
10、拟机负责调用该线程的 run() 方法。 void sleep(long millis):静态方法,线程进入阻塞状态,在指定时间(单位为毫秒)到达之后进入就绪状态。 void yield():静态方法,当前线程放弃占用CPU资源,回到就绪状态,使其他优先级不低于此线程的线程有机会被执行。 void join() :当前线程等待加入(join)的线程完成,才能继续往下执行。 void interrupt():中断线程的阻塞状态(而非中断线程)。 void isAlive():判定该线程是否处于活动状态,处于就绪、运行和阻塞状态的都属于活动状态。 void setPriority(int newP
11、riority):设置当前线程的优先级。 int getPriority():获得当前线程的优先级。24终止线程3-1 需求:计数功能,每间隔2秒输出1、2、3一直到100结束。当用户想中止这个计数功能时,只要在控制台输入s即可。25终止线程3-2import java.util.Scanner;public class EndingThreadpublic static void main(String args) CountThread t = new CountThread();t.start();Scanner scanner = new Scanner(System.in);Syst
12、em.out.println(如果想终止输出计数线程,请输入s);while(true)String s = scanner.nextLine();if(s.equals(s)t.stopIt();break;26终止线程3-3/计数功能线程class CountThread extends Thread private int i = 0; public CountThread() super(计数线程); /通过设置i=100,让线程终止 public void stopIt() i = 100; public void run() try while(i 100) System.out.
13、println(this.getName() + 计数: + (i+1);i+;sleep(2000); catch(Exception e) e.printStackTrace(); 实现循环计数27线程等待和中断等待public class InterruptThreadpublic static void main(String args) CountThread t = new CountThread();t.start();tryThread.sleep(6000);catch(InterruptedException e)e.printStackTrace();/中断线程的阻塞状态
14、(而非中断线程)errupt();28线程等待和中断等待class CountThread extends Thread private int i = 0; public CountThread()super(计数线程); public void run()while(i 100) trySystem.out.println(this.getName() + 计数: + (i+1);i+;Thread.sleep(5000); catch(InterruptedException e)System.out.println(程序捕获了InterruptedException异常!);
15、 System.out.println(计数线程运行1次!); 29守护线程public class DaemonThreadpublic static void main(String args) DThread t = new DThread();t.start();System.out.println(让一切都结束吧);private static class DThread extends Thread/在无参构造方法中设置本线程为守护线程public DThread() setDaemon(true);public void run() while(true)System.out.p
16、rintln(我是后台线程);该线程属于创建它的线程,当主线程结束时该线程也跟着结束。30课堂练习00:30331案例描述案例描述: : 编写JAVA程序,实现守护线程,一个守护线程要随着主线程的终止 而终止; 效果图效果图: :K练习内容练习时间:15分钟K=案例案例一一32案例描述案例描述: :线程方法join使用; 效果图效果图: :K练习内容练习时间:15分钟K=案例案例二二33共性问题解决34 常见调试问题及解决办法 代码规范问题共性问题内容进度多线程创建和使用线程线程控制共享数据线程死锁和协作35线程间共享数据2-1public class ShareData static int
17、 data = 0; /定义了一个充当锁的对象:lock,注意lock被定义为static static final Object lock = new Object(); public static void main(String args)ShareThread1 st1 = new ShareThread1();ShareThread2 st2 = new ShareThread2();new Thread(st1).start();new Thread(st2).start(); private static class ShareThread1 implements Runnabl
18、e public void run() /对lock对象上锁synchronized(lock) while(data 10) try Thread.sleep(1000); System.out.println(这个小于10的数据是: + data+); catch (InterruptedException e) e.printStackTrace(); 静态内部类线程创建测试线程36线程间共享数据2-2private static class ShareThread2 implements Runnablepublic void run() /对lock对象上锁 synchronized
19、(lock)while(data 100) data+;System.out.println(ShareThread2执行完后data的值为: + data); 静态内部类线程37多线程同步 多线程同步依靠的是对象锁机制,synchronized关键字就是利用锁来实现对共享资源的互斥访问。 理解同步和锁:Java用监视器的手段来完成线程的同步。监视器给受保护的资源外面加了一把锁,而这把锁只有一把钥匙,每一个线程只有在得到这把钥匙之后才可以对被保护的资源执行操作,这线程执行操作完成之后,再将这把钥匙交给下一个即将对所要保护资源进行操作的线程,而其他的线程只能等待,直到拿到这把钥匙。38使用同步
20、Java中用关键字synchronized来完成监视器这一角色。 synchronized同步关键字的两种使用方式:任何时刻那些被多个线程共享的资源的操作应放在同步方法或同步块中完成。 声明同步方法:public synchronized void synchronizedMethod( )/同步操作方法体 同步代码块:synchronized (需要同步操作的对象) /同步对象操作的语句39多线程同步publicclassTestSyncThread2publicstaticvoidmain(Stringargs)/创建一个线程之间竞争使用的对象Objectobj=newObject();f
21、or(inti=0;i5;i+)newThread(newSyncThread(i,obj).start();class SyncThread implements java.lang.Runnable private int tid; private Object lock; /同步锁 /构造方法引入竞争对象 public SyncThread(int id, Object obj) this.tid = id; this.lock = obj; public void run() synchronized(lock) for (int i = 0; i 10; i+) System.out
22、.println(线程ID名为: + this.tid + 正在输出: + i); 同步代码块40课堂练习00:30341案例描述案例描述: :线程互斥访问(一个资源被一个线程使用结束,该资源才能被其他线程调用); 效果图效果图: :K练习内容练习时间:30分钟K=案例案例一一42共性问题解决43 常见调试问题及解决办法 代码规范问题共性问题441、下列说法中错误的一项是( ) A、共享数据的所有访问都必须使用synchronized加锁 B、共享数据的访问不一定全部使用synchronized加锁 C、所有的对共享数据的访问都是临界区 D、临界区必须使用syschronized标识 2、下列
23、有关线程的叙述中正确的一项是( ) A、一旦一个线程被创建,它就立即开始运行 B、使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行 C、当一个线程因为抢占机制而停止运行时,它被放在可运行队列的前面 D、一个线程可能因为不同的原因而终止并进入终止状态课堂小结BB现场提问:内容进度多线程创建和使用线程线程控制共享数据线程死锁和协作45什么是死锁46同步中的死锁问题 如果有两个或两个以上的线程都访问了多个资源,而这些线程占用了一些资源的同时又在等待其它线程占用的资源,也就是说多个线程之间都持有了对方所需的资源,而又相互等待对方释放的资源。在这种情况下就会出现死锁。 要解决死
24、锁就要对线程共享的资源做同步控制。 在同步控制中正确的使用sleep()、wait()方法和notify()、 notifyAll()方法。47sleep(),wait()方法 线程调用了sleep()方法,当前线程进入睡眠,但不会释放所占用资源对象的锁。在sleep 时间间隔期满后,线程不一定立即恢复执行(其它线程可能没执行完)。sleep()是线程的静态方法 线程调用了它所占用资源对象的wait()时,使当前线程进入等待队列,同时释放所占用资源对象的锁。直到其他线程调用此资源对象上的 notify() 方法或notifyAll() 方法时所有等待资源对象的线程被唤醒。wait()是Obje
25、ct对象的方法,不是线程的方法wait()只能在同步方法或同步代码块中使用wait()方法和notify()、notifyAll()方法总是配对使用48notity(),notifyAll()方法 notity():随机唤醒一个想要获对象锁的处于等待状态的线程来执行。 notifyAll():唤醒所有处于等待状态的线程。调用notifyAll()方法并不会立即激活某个等待线程。它只能撤销等待线程的中断状态,这样它们就能够在当前线程退出synchronized方法后,与其它线程展开竞争,以争取获得资源对象来执行。49线程的死锁3-1public class DeadLockThread/创建两个
26、线程之间竞争使用的对象private static Object lock1 = new Object();private static Object lock2 = new Object();public static void main(String args)new Thread(new ShareThread1().start();new Thread(new ShareThread2().start();50线程的死锁3-2private static class ShareThread1 implements Runnablepublic void run()synchronize
27、d(lock1)tryThread.sleep(50);catch(InterruptedException e)e.printStackTrace();synchronized(lock2) System.out.println(ShareThread1);51线程的死锁3-3private static class ShareThread2 implements Runnablepublic void run()synchronized(lock2)tryThread.sleep(50);catch(InterruptedException e)e.printStackTrace();sy
28、nchronized(lock1) System.out.println(ShareThread2);52线程的协作 Java提供了wait()、notify()、notifyAll()三个方法,解决线程之间协作的问题。这三个方法均是java.lang.Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常。void wait():当前线程等待,等待其他线程调用此对象的 notify() 方法或 notifyAll() 方法将其唤醒。void notify():唤醒在此对象锁上等待的单个线程。void notifyAll():唤醒在此对象锁上等待的所有线程。53线程的协作5
29、-1 需求定义一个集合模拟长条容器存放热狗,集合里实际存放Integer,其值代表热狗的编号(热狗编号规则举例:300002代表编号为3的厨师做的第2个热狗),这样能通过集合添加和删除,实现先进先出;以热狗集合作为对象锁,所有对热狗集合的操作(在长条容器中添加、取走热狗)互斥,这样保证不会出现多个顾客同时取最后剩下的一个热狗的情况,也不会出现多个厨师同时添加热狗造成长条容器里热狗数大于10个的情况;当厨师希望往长条容器中添加热狗时,如果发现长条容器中已有10个热狗,则停止做热狗,等待顾客从长条容器中取走热狗的事件发生,以唤醒厨师可以重新进行判断,是否需要做热狗;当顾客希望往长条容器中取走热狗时
30、,如果发现长条容器中已没有热狗,则停止吃热狗,等待厨师往长条容器中添加热狗的事件发生,以唤醒顾客可以重新进行判断,是否可以取走热狗吃;54线程的协作5-2 线程的协作import java.util.*;public class TestProdCons /定义一个存放热狗的集合,里面存放的是整数,代表热狗编号 private static final List hotDogs = new ArrayList(); public static void main(String args)for(int i = 1;i = 3;i+) new Producer(i).start();for(int i = 1;i = 5;i+) new Consumer(i).start();try Thread.sleep(2000);catch(InterruptedException e) e.printStackTrace();System.exit(0); 55线程的协作5-3/生产者线程,以热狗集合作为对象锁,所有对热狗集合的操作互斥 private static class Producer extends Threadint i = 1;int pid = -1;pu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-河北-河北地图绘制员一级(高级技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-广西-广西计量检定工四级(中级工)历年参考题库典型考点含答案解析
- 烹饪面点课件
- 2025年事业单位工勤技能-安徽-安徽环境监测工二级(技师)历年参考题库典型考点含答案解析
- 2020-2025年一级注册建筑师之建筑材料与构造通关题库(附答案)
- 2025年驾驶证考试-摩托车理论考试-摩托车驾驶证(科目一)历年参考题库含答案解析(5套)
- 2025年银行金融类-金融考试-银行业专业人员初级(法规+个人贷款)历年参考题库含答案解析(5套)
- 2025年职业技能鉴定-铣工-铣工职业技能鉴定(技师)历年参考题库含答案解析(5套)
- 2025年职业技能鉴定-铁路职业技能鉴定-货运员(中级工)历年参考题库含答案解析(5套)
- 2025年职业技能鉴定-合成氨生产工-合成氨生产工职业技能鉴定(中级)历年参考题库含答案解析(5套)
- 儿童保健培训
- 消防系统课件
- 雪迪龙烟气在线监测系统(cems)技术资料教程文件
- YS/T 231-2007钨精矿
- GB/T 26520-2011工业氯化钙
- GB/T 18983-2017淬火-回火弹簧钢丝
- GB/T 14691-1993技术制图字体
- 《夯实法治基石》设计 省赛一等奖
- 食材配送服务及应急保障方案
- 常见婚姻家庭纠纷及调解技巧课件
- 2023年8月17日云南省临沧市遴选公务员笔试真题及解析
评论
0/150
提交评论