版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
11.1.1线程概述11.1.2线程的创建方式11.1Java线程多线程Java语言程序设计Unit1111.1.1线程概述1线程与进程线程线程多进程多线程运行中的应用程序称为进程,拥有系统资源(cpu、内存)进程中的一段代码,一个进程中可以有多段代码。本身不拥有资源(共享所在进程的资源)在操作系统中能同时运行多个任务(程序)在同一应用程序中有多个功能流同时执行11.1.1线程概述2线程的主要特点123不能以一个文件名的方式独立存在在磁盘中不能单独执行,只有在进程启动后才可启动线程可以共享进程相同的内存(代码与数据)11.1.1线程概述3多线程的主要用途(1)利用它可以完成重复性的工作(如实现动画、声音等的播放)(2)从事一次性较费时的初始化工作(如网络连接、声音数据文件的加载)(3)并发执行的运行效果(一个进程多个线程)以实现更复杂的功能11.1.1线程概述4多线程(多个线程同时运行)程序的主要优点①可以减轻系统性能方面的瓶颈,因为可以并行操作;②提高CPU的处理器的效率,在多线程中,通过优先级管理,可以使重要的程序优先操作,提高了任务管理的灵活性;另一方面,在多CPU系统中,可以把不同的线程在不同的CPU中执行,真正做到同时处理多任务。11.1.1线程概述11.1.2线程的创建方式11.1Java线程浙江经贸职业技术学院多线程Java语言程序设计Unit11主讲吕丽华11.1.2线程的创建方式1与创建线程有关的概念
Java创建线程的方式一种是继承java.lang.Thread类。另一种是实现java.lang.Runnable接口。
创建线程的几个方法线程体:publicvoidrun()方法,其内的程序代码决定了线程的行为和功能。线程启动:publicvoidstart(),线程启动后,需要获取cpu才能自动调用run()运行。线程休眠:publicvoidsleep(longms),线程将暂停,放弃cpu。11.1.2线程的创建方式2继承Thread类创建线程通过一个例子来说明Thread类创建线程的方法。知识应用
11.1.2线程的创建方式3实现Runable接口创建线程通过一个例子来说明Runable接口创建线程的方法。知识应用11.2.1线程生命周期11.2.2线程状态11.2线程控制浙江经贸职业技术学院多线程Java语言程序设计Unit11主讲吕丽华11.2.1线程生命周期
线程的5个状态线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。
线程状态变化图新建状态就绪状态阻塞状态运行状态死亡状态11.2.1线程生命周期1新建状态(NewThread)publicvoidstart(){if(clockThread==null){clockThread=newThread(cp,"Clock");clockThread.start();}}当Applet启动时调用Applet的start()方法,此时小应用程序就创建一个Thread对象clockThread。,当该语句执行后clockThread就处于新建状态。注意处于该状态的线程仅仅是空的线程对象,并没有为其分配系统资源。当线程处于该状态,你仅能启动线程,调用任何其他方法是无意义的且会引发IllegalThreadStateException异常。
cp作为线程构造方法的第一个参数,该参数必须是实现了Runnable接口的对象并提供线程运行的run()方法,第二个参数是线程名。11.2.1线程生命周期2线就绪状态(Runnable)publicvoidstart(){if(clockThread==null){clockThread=newThread(cp,"Clock");clockThread.start();}}
新创建的线程clockThread并不自动开始运行,当该对象调用start()方法即启动了线程;start()方法创建线程运行的系统资源,并调度线程运行run()方法;当start()方法返回后,线程就处于就绪状态。注意处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程。因为在单CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由Java运行时系统的线程调度程序(threadscheduler)来调度的。11.2.1线程生命周期3运行状态(Running)publicvoidrun(){while(true){repaint();try{Thread.sleep(1000);}catch(InterruptedExceptione){}}当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法,这里run()方法中是一个循环,循环条件是true。4阻塞状态(Blocked)线程运行过程中,可能由于各种原因进入阻塞状态。所谓阻塞状态是正在运行的线程没有运行结束,暂时让出CPU,这时其他处于就绪状态的线程就可以获得CPU时间,进入运行状态。11.2.1线程生命周期5死亡状态(Dead)线程的正常结束,即run()方法返回,线程运行就结束了,此时线程就处于死亡状态。
通常在run()方法中是一个循环,要么是循环结束,要么是循环的条件不满足,这两种情况都可以使run()方法返回,使线程正常结束,进入死亡状态。循环自然结束,run()方法返回,线程结束:publicvoidrun(){inti=0;while(i<100){i++;System.out.println("i="+i);}}循环条件不满足,如小应用程序中,run()的循环条件是clockThread不是null时为true,但当用户离开含有该小应用程序的页面时,浏览器调用stop方法,将clockThread设置为null,run()的循环条件修改为false,循环结束,run()方法返回,线程结束:publicvoidstop(){clockThread=null;}11.2.1线程生命周期11.2.2线程状态11.2线程控制浙江经贸职业技术学院多线程Java语言程序设计Unit11主讲吕丽华11.2.2线程状态1睡眠状态
睡眠状态(线程休眠)睡眠状态也叫线程休眠,线程调用方法publicvoidsleep(longms),将线程将暂停,放弃cpu。在线程运行过程中可以调用sleep()方法并在方法参数中指定线程的睡眠时间将线程状态转换为睡眠状态。这时,该线程在不释放占用资源的情况下停止运行指定的睡眠时间。时间到达后,线程重新由JVM线程调度器进行调度和管理。11.2.2线程状态1睡眠状态使用sleep()方法使线程每过1秒钟进行计数,直到计数到5。计数停顿期间进入睡眠状态。知识应用11.2.2线程状态2线程中断线程的errupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断之后线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断标示值是否为true)。它并不像stop方法那样会中断一个正在运行的线程。Thread中与中断相关的三个方法(1)interrupt:置线程的中断状态(2)isInterrupt:将线程中断标示位设置为true后,不会立刻清除中断标示位,即不会将中断标设置为false(3)interrupted:返回线程的上次的中断状态,并清除中断状态,重新设置为false。11.2.2线程状态3线程阻塞
阻塞状态处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态。在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。11.2.2线程状态3线程阻塞暂停Threads执行的方法(2)yield()方法让出CPU的使用权,从运行态直接进入就绪态。(1)sleep()方法可以调用Thread的静态方法:publicstaticvoidsleep(longmillis)throwsInterruptedException使得当前线程休眠(暂时停止执行millis毫秒)。(3)join()方法当某个(A)线程等待另一个线程(B)执行结束后,才继续执行时,使用join()方法。A的run()方法调用b.join(),b是线程B的线程实例。这样当A线程执行结束后,会通过b.join()自动启动B线程的执行。11.2.2线程状态3线程阻塞yield()方法暂停Thread执行示例。让出CPU的使用权,从运行态直接进入就绪态。知识应用
11.2.2线程状态4线程等待
线程等待(线程就绪)线程等待又叫线程就绪。处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列,等待系统为其分配CPU。
cpu调度等待状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作称之为“cpu调度”。一旦获得CPU,线程就进入运行状态并自动调用自己的run()方法。11.2.2线程状态5线程终止
线程终止(死亡状态)线程终止就是线程死亡状态。死亡状态是线程生命周期中的最后一个阶段。当一个线程进入死亡状态以后,就不能再回到其它状态了。
线程死亡的原因一个是正常运行的线程完成了它的全部工作;另一个是线程被强制性地终止,如通过执行stop()或destroy()方法来终止一个线程。11.2.2线程状态5线程终止体现线程状态转变的代码示例。知识应用
浙江经贸职业技术学院案例
11-1单元11多线程订阅报刊杂志案例单元Java语言程序设计主讲吕丽华eclipseeclipseeclipse案例目标
以读者订阅报刊杂志为背景,体验多线程生成/订阅模式下的经典应用。案例解释线程池是指先创建多个线程放在线程池中,当有任务需要执行时,从线程池中找一个空闲线程执行任务,任务完成后,并不销毁线程,而是返回线程池,等待新的任务安排。案例11-1:订阅报刊杂志案例效果案例11-1:订阅报刊杂志实现思路基本步骤创建共享连接池SharePool类,用于放置可以处理用户SharePool中List对象用户存放用户请求SharePool的produce方法用户生成节点,当共享连接池满,则禁止增加节点,线程进入等待SharePool的consume方法用户移除用户节点,当连接池中没有节点,则线程进入等待Producer类处理连接池中的订阅请求,直到请求个数为0Consumer类处理移除连接池中已经处理的节点浙江经贸职业技术学院多线程Java语言程序设计Unit11主讲吕丽华11.4.1多线程问题11.4.3线程死锁问题11.4.4volatile字段11.4线程同步11.4.2synchronized关键字11.4.5CountDownLatch字段11.4.1多线程问题一个线程两个线程单线程程序示意图
多线程程序示意图多线程(multi-thread)是指在单个的程序内可以同时运行多个不同的线程完成不同的任务,如图所示为单线程运行和两个线程运行。浙江经贸职业技术学院多线程Java语言程序设计Unit11主讲吕丽华11.4.1多线程问题11.4.3线程死锁问题11.4.4volatile字段11.4线程同步11.4.2synchronized关键字11.4.5CountDownLatch字段11.4.2synchronized关键字
互斥锁在有些情况下,多个线程需要共享数据资源,这就涉及到线程的同步与资源共享的问题。
在Java语言中,为保证共享数据操作的完整性,引入了对象互斥锁的概念。每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。11.4.2synchronized关键字
关键字synchronizedJava对象默认是可以被多线程共用的,在需要时才启动“互斥”机制,成为专用对象。
关键字synchronized用来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象已启动“互斥”机制,在任一时刻只能由一个线程访问。即使该线程出现阻塞,该对象的被锁定状态也不会解除,其他线程仍不能访问该对象。11.4.2synchronized关键字(1)同步互斥方法publicsynchronizedvoidmethod(){//允许访问控制的代码}(2)同步互斥代码块synchronized(syncObject){//允许访问控制的代码}(3)锁定整个类publicsynchronizedclassSyncObject{ }利用Synchronized关键字用于修饰同步互斥的方法:由于synchronized块可以针对任意的代码块,且可任意指定上锁的对象,因此灵活性较高。浙江经贸职业技术学院多线程Java语言程序设计Unit11主讲吕丽华11.4.1多线程问题11.4.3线程死锁问题11.4.4volatile字段11.4线程同步11.4.2synchronized关键字11.4.5CountDownLatch字段11.4.3线程死锁问题举例一个线程需要锁定两个对象才能完成,线程1拥有对象A的锁,线程1如果再拥有对象B的锁就能完成操作,线程2拥有对象B的锁,线程2如果再拥有对象A的锁就能完成操作。困境很不幸的是线程1执行不下去了,因为线程1等待的资源对象B被线程2锁住了,线程2也执行不下去了,因为线程2等待的资源对象A被线程1锁住了,这样就造成了死锁。使用互斥锁容易产生死锁问题11.4.3线程死锁问题1生产者与消费者问题在一个果园里,有农夫和小孩,农夫会不停的采摘水果放入果园中心的一个水果筐直到水果筐满,而小孩会不停的从水果筐里拿水果来吃,直到水果拿完。实例农夫可以看成是一个生产者的线程,小孩可以看成是一个消费者的线程,而大水果筐是共享资源。模型分析11.4.3线程死锁问题1生产者与消费者问题用Java程序的多线程的代码示例,表示上述的生产者与消费者问题。知识应用11.4.3线程死锁问题2wait()方法如果生产的速度大于消费的速度就会导致功大于求,水果筐很容易就满了,然而生产者又一直抱着水果筐不放,没有机会给消费者使用,消费者不消费生产者就无法生产,所以就造成了死锁。实例说明死锁会出现么?在两个同步互斥方法中用到了wait和notify方法,这两个方法是为了防止死锁的。wait是Object类的方法,它的作用是拥有互斥锁的线程放弃锁的使用权,进入wait池进行等待,那么互斥锁就有可能被其他线程获得以执行其他任务。怎么解决?11.4.3线程死锁问题3notify()方法notify()也是Object类的方法,它的作用是从wait池中唤醒一条正在等待的线程进入就绪状态,被唤醒的这条线程就很可能重新获得cup和互斥锁来完成它的任务。4notifyAll()方法notifyAll()和notify()很相似,它是从wait()池中唤醒所有正在等待的线程进入就绪状态。
注意:以上三个方法都只能在synchronized方法中应用,否者会出现下面的异常信息:IllegalMonitorStateException:currentthreadnotowner。11.4.3线程死锁问题举例说明生产者和消费者的关系以及如何避免死锁问题。知识应用
11.4.3线程死锁问题5终止线程
终止线程终止线程也就是将线程的状态转换为死亡状态,死亡状态是线程生命周期中的最后一个阶段。
线程死亡的原因一个原因是正常运行的线程完成了它的全部工作;另一个原因是线程被强制性地终止,如通过执行stop或destroy方法来终止一个线程。
回收线程占用的资源当线程体运行结束或者调用线程对象的stop()方法后线程将终止运行,由JVM收回线程占用的资源。浙江经贸职业技术学院多线程Java语言程序设计Unit11主讲吕丽华11.4.1多线程问题11.4.3线程死锁问题11.4.4volatile字段11.4线程同步11.4.2synchronized关键字11.4.5CountDownLatch字段11.4.4volatile字段volatile用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。volatile相当于synchronized的弱实现,也就是说volatile实现了类似synchronized的语义,却又没有锁机制。11.4.4volatile字段互斥(mutualexclusion)可见性(visibility)12锁的主要特性互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的--如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。11.4.4volatile字段volatile包含以下语义:(1)Java存储模型不会对valatile指令的操作进行重排序:这个保证对volatile变量的操作时按照指令的出现顺序执行的。(2)volatile变量不会被缓存在寄存器中(只有拥有线程可见)或者其他对CPU不可见的地方,每次总是从主存中读取volatile变量的结果。也就是说对于volatile变量的修改,其它线程总是可见的,并且不是使用自己线程栈内部的变量。也就是在happens-before法则中,对一个valatile变量的写操作后,其后的任何读操作理解可见此写操作的结果。尽管volatile变量的特性不错,但是volatil
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2027届江苏省泰兴市中考五模物理试题含解析
- 医院科室安全生产培训制度
- 2026年事业招聘模拟题及答案详解
- 涉及整形手术的随诊医疗的护理查房
- 2026年汽车基础知识测模拟题及答案详解
- 结构工程师一级基础测试题模拟测试题及答案详解
- 2026年农艺师职称考试农业机械学模拟题及答案详解
- 2026年初级会计职称考试模拟试卷及答案详解
- 2026年残联专职委员模拟试题(含答案)
- 2026年电大教师招聘模拟试题(含答案)
- 2025年中国农业银行校园招聘考试笔试题试卷真题附答案
- 雨课堂学堂在线学堂云《急救与心理技能(中南大学)》单元测试考核答案
- 安徽省江南十校2027届高三9月综合素质检测语文试卷(含答案)
- 城市道路路面养护工程竣工验收报告
- 2026秋新教材人教版四年级上册数学全册教案(教学设计)
- 部编版七年级语文上册古诗文理解性默写
- 2026 国企项目现场管控岗招聘考试参考题库 含答案
- 2025年西藏自治区林芝市网格员招聘笔试试题及答案详解
- 2026中盐安徽红四方肥业股份有限公司招聘15人笔试备考试题及答案详解
- 统编版小学语文二年级下册第五单元测试卷(含答案)
- 2026年环保隐患排查表
评论
0/150
提交评论