收藏 分享(赏)

第14章多线程.ppt

上传人:hskm5268 文档编号:10035914 上传时间:2019-09-30 格式:PPT 页数:22 大小:196KB
下载 相关 举报
第14章多线程.ppt_第1页
第1页 / 共22页
第14章多线程.ppt_第2页
第2页 / 共22页
第14章多线程.ppt_第3页
第3页 / 共22页
第14章多线程.ppt_第4页
第4页 / 共22页
第14章多线程.ppt_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、0,多线程,1,本讲主要内容,概述 线程的基本概念 线程的生命周期 建立多线程的两种方式 Thread类及其有关方法 线程的同步与死锁,2,9.1 Java中的线程,程序是一段静态的代码,它是应用软件执行的蓝本。 进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。 Java的多线程就是在操作系统每次分时给Java程序一个时间片的CPU时间内,在若干个独立的可

2、控制的线程之间切换。,3,每个Java程序都有一个缺省的主线程。我们已经知道, Java应用程序总是从主类的main方法开始执行。当JVM加载代码,发现main方法之后,就会启动一个线程,这个线程称作“主线程”,该线程负责执行main方法。那么,在main方法的执行中再创建的线程,就称为程序中的其它线程。如果main方法中没有创建其他的线程,那么当main方法执行完最后一个语句,即main方法返回时,JVM就会结束我们的Java应用程序。如果main方法中又创建了其他线程,那么JVM就要在主线程和其他线程之间轮流切换,保证每个线程都有机会使用CPU资源,main方法即使执行完最后的语句,JVM

3、也不会结束我们的程序,JVM一直要等到程序中的所有线程都结束之后,才结束我们的Java应用程序,4,2.线程的状态与生命周期,新建 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。此时它已经有了相应的内存空间和其他资源。 运行 线程创建之后就具备了运行的条件,一旦轮到它来享用CPU资源时,即JVM将CPU使用权切换给该线程时,此线程的就可以脱离创建它的主线程独立开始自己的生命周期了(即run方法执行的过程)。 中断 有4种原因的中断:CPU资源从当前线程切换给其他线程、执行了sleep(int millsecond)方法、执行了wait()方法、进入阻塞状态 。

4、死亡 run方法结束 。,5,线程状态转换图,Start( ),Sleep( ),Run(),新建状态,就绪状态,阻塞状态,运行状态,死亡,6,启动线程,线程创建后仅仅是占有了内存资源,在JVM管理的线程中还没有这个线程,此线程必须调用start()方法(从父类继承的方法)通知JVM,这样JVM就会知道又有一个新一个线程排队等候切换了。,7,9.2 Thread的子类创建线程,用Thread类或子类创建线程对象 . 编写Thread类的子类时,需要重写父类的run方法,其目的是规定线程的具体操作,否则线程就什么也不做,因为父类的run方法中没有任何操作语句。 当JVM将CPU使用权切换给线程时

5、,如果线程是Thread的子类创建的,该类中的run方法就立刻执行。 例1,8,使用Runable接口,创建线程的另一个途径就是用Thread类直接创建线程对象。使用Thread创建线程对象时,通常使用的构造方法是:Thread(Runnable target)该构造方法中的参数是一个Runnable类型的接口,因此,在创建线程对象时必须向构造方法的参数传递一个实现Runnable接口类的实例,该实例对象称作所创线程的目标对象. 当线程调用start方法后,一旦轮到它来享用CPU资源,目标对象就会自动调用接口中的run方法(接口回调) .例2,9,9.4线程的常用方法,1start() 线程调

6、用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。,10,2run(),Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。系统的Thread类中,run()方法没有具体内容,所以用户程序需要创建自己的Thread类的子类,并重写run()方法来覆盖原来的run()方法。当run方法执行完毕,线程就变成死亡状态。,11,3sleep(int millsecond),现程占有CPU期间,执行slee

7、p方法来使自己放弃CPU资源,休眠一段时间。休眠时间的长短由sleep方法的参数决定,millsecond是毫秒为单位的休眠时间。如果线程在休眠时被打断,JVM就抛出InterruptedException异常。因此,必须在trycatch语句块中调用sleep方法。,12,4isAlive(),线程处于“新建”状态时,线程调用isAlive()方法返回false。当一个线程调用start()方法,并占有CUP资源后,该线程的run方法就开始运行,在线程的run方法结束之前,即没有进入死亡状态之前,线程调用isAlive()方法返回true。当线程进入“死亡”状态后(实体内存被释放),线程仍可

8、以调用方法isAlive(),这时返回的值是false。 一个已经运行的线程在没有进入死亡状态时,不要再给线程分配实体,由于线程只能引用最后分配的实体,先前的实体就会成为“垃圾”,并且不会被垃圾收集机收集掉 .,13,5currentThread(),currentThread()方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。,14,6interrupt(),intertupt方法经常用来“吵醒”休眠的线程。当一些线程调用sleep方法处于休眠状态时,一个占有CPU资源的线程可以让休眠的线程调用interrupt 方法“吵醒”自己 .,15,线程同步的

9、概念,问题的提出 线程对内存、数据的共享 线程执行的不确定性引起执行结果的不稳定 问题的解决 同步: 用synchronized关键字前缀给针对共享资源的操作加锁;同步方法、同步块使用synchronized来实现一次只能有一个线程的一个方法或代码块执行的功能。 管程:最先进入同步块的线程拥有该块的管程,其他线程将不能执行该块代码, 不能改变共享变量, 直到原线程结束或调用wait()释放管程,16,线程同步的实现,wait()与notify() Object类的方法:public final void wait():令当前线程挂起并放弃管程,同步资源解锁,使别的线程可访问并修改共享资源,而当

10、前线程排队等候再次对资源的访问 notify()唤醒正在排队等待资源管程的线程中优先级最高者,使之执行并拥有资源的管程wait() + notify() + 标志变量:可协调、同步不同线程的工作 sleep():休眠时并不放弃管程(monitor),17,监控器(Monitor) Java通过监控器来实现并发控制机制。监控器是一个对象,监控一个过程等, 目的是确保一次 只有一个线程执行所监控的过程。Java中,每个对象都有一个监控对象, 一般用于规范操 作权限。当用于同步方法时, 监控器确保一次只有一个线程执行 所监控的synchronized方法。当前执行的线程完成后,其他线程才能执行。 没

11、有线 程执行时,监控器自锁。监控器不是真正意义上的对象,它没有方法和属性。通过方法wait()和notify()来实现线程间的同步通讯。,18,具体编程时,使用关键字synchronized(即同步控制) 类方法的格式: public|protected|private static final|abstract native synchronized returnType methodName(paramList)throws exceptionList /语句 使用synchronized来实现一次只能有一个线程执行 一个方法或代码块的功能。,19,举例: class SpeechSynt

12、hesizersynchronized void say(String words)/Speak int myMethod()synchronized (myObject)/. ,20,十一、线程的死锁,死锁 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁 解决方法 专门的算法、原则 尽量减少同步资源的定义,21,练习题,简述程序、进程和线程之间的关系, 什么是多线程程序? 线程有哪五个状态? 他们之间如何转化?简述线程的生命周期和优先级 使用Thread和Runnable建立线程有何不同? 利用多线程技术编写Applet程序, 其中包含一个滚动的字符串,从左向右循环运动;屏幕上有一个TextField组件,输入新的字符串后回车,滚动的字符串更新, 并重新从左向右循环运动,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报