Java面向对象程序设计(第2版)第09章

上传人:飞*** 文档编号:34135602 上传时间:2018-02-21 格式:PPT 页数:20 大小:231KB
返回 下载 相关 举报
Java面向对象程序设计(第2版)第09章_第1页
第1页 / 共20页
Java面向对象程序设计(第2版)第09章_第2页
第2页 / 共20页
Java面向对象程序设计(第2版)第09章_第3页
第3页 / 共20页
Java面向对象程序设计(第2版)第09章_第4页
第4页 / 共20页
Java面向对象程序设计(第2版)第09章_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《Java面向对象程序设计(第2版)第09章》由会员分享,可在线阅读,更多相关《Java面向对象程序设计(第2版)第09章(20页珍藏版)》请在金锄头文库上搜索。

1、第九章 线程,主要内容:,线程的概念线程的控制与调度线程的同步机制线程间的同步通信多线程应用场景,线程的概念,线程与进程。,一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间、一组系统资源,每一个进程的内部数据和状态都是完全独立的。Java程序执行中的单个顺序的流控制称为线程,多线程则指一个进程中可以同时运行多个不同的线程,执行不同的任务。,线程与进程不同的点是:同类的多个线程共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多 。,Thread类,构

2、造方法、静态方法、实例方法 。,【例9.1】 通过继承Thread类创建线程,类MyThread声明为Thread的子类 。,Runnable接口,例【9.2】 利用Runnable接口产生线程 。,接口方法:public void run(),多线程并发效果,【例9.3】,线程组ThreadGroup,volatile修饰符,两种创建线程方法的比较,直接继承线程Thread类:该方法编写简单,可以直接操作线程,由于已经继承了Thread,不能再继承其他类了;实现Runnable接口:当一个类已继承了另一个类时,就只能用实现Runnable接口的方式来创建线程;另外,使用此方法的更多原因是多个

3、线程共享某个对象的资源。,例【9.4】,线程的控制与调度,线程的生命周期和状态的改变,【例9.5】,a.join语句能使main线程暂时停止运行,直到a线程完成后继续执行。,线程调度与优先级,调度策略:同优先级先到先服务;不同优先级,高优先先行,例【9.6】,程序说明 让t1先运行,5ms后t2运行,由于t2具有高优先级,所以t2运行结束后,t1得以执行。如果去掉t2的高优先级,可以发现二个线程交替运行。,线程的同步机制,线程安全问题的提出,例【9.7】,public void push(char c) dataindex=c; /(1) index+; /(2),Synchronized的三

4、种用法synchronized 代码块:监视器就是指定的对象。synchronized 方法:监视器就是this对象。synchronized 静态方法:监视器就是相应的Class对象。,死锁问题,注意1)可能发生死锁的代码执行中不一定会死锁,因为线程之间的执行存 在很大的随机性。2)线程方法suspend()、resume()、stop()由于存在引起死锁的可能, 因而逐渐不用(Deprecated)。,如果多个线程都处于等待状态,彼此需要对方所占用的监视器所有权,就构成死锁(deallock),Java即不能发现死锁也不能避免死锁。,可能发生死锁的两种可能,线程间的同步通信,同步通信问题的

5、提出和解决,例【9.10】,程序的结果和原先设想存在很大的差距。对Accout类的put和get方法加入synchronized后,情况仍然没有改观,原因在于:synchronized只能保证同一时刻只能有一个线程要么存要么取。无法保证存和取之间的同步通信关系,从而无法避免多次存后再多次取现象的发生,同步通信问题的提出和解决,例【9.11】,执行save的线程调用了put方法时,由于put方法前存在的synchronized关键字,它拥有了Account对象的监视权,如果发现有资金,将执行对象的wait方法,使线程暂停并释放该对象监视权(sleep方法不会释放),进入一个以此对象监视器为标志的

6、队列当中,这样执行fetch的线程就可以获得该对象监视权而执行get方法,当get方法执行完毕后,调用notify()释放该对象监视权并唤醒队列中和它拥有同类型对象监视器标签的等待线程(注意:并不唤醒哪些和它的对象监视器标志不同的线程),于是执行save的线程就被唤醒得以继续执行,上述过程反之亦然。,两个线程之间的同步通信,需要方法前的synchronized、方法中wait和notify、一个布尔型的变量指示器之间的配合得以实现。,notifyAll(),例【9.12】,程序说明1)当两个存线程处于等待状态时,一个取线程使用notifyAll将它们都唤醒,这两个存线程通过竞争来获得监视权,获

7、得对象监视权的线程继续执行。2)相对例9.11,本例中的布尔变量指示器isMoney前的关键字由if变为while,其原因是:当两个存线程中的一个执行完毕调用notifyAll时,可能同时会激活取线程和另一个存线程,如果存线程获得了监视权,则会在while代码块中重新wait,从而将监视权让给了取线程,多线程应用场景,1、大多数WEB服务器处理客户端的服务请求就采用的是多线程模式,每个客户相当于激发该服务的一个处理线程。2、当处理一个执行时间较长的请求时,一般让一个线程进行处理,而另一个线程进行控制,这样,如果用户需要选择“取消”时,可以强迫处理线程停止运行。3、通讯时,可以让一个线程负责接受,另一个负责发送,这样可以实现通讯的“全双工”。4、对WEB服务器进行测试时,可以在一个进程中产生多个线程,每个线程相当于一个客户对WEB服务器进行访问,从而可以编写压力测试工具。但要注意的是,对于一个进程,不要产生过多的线程,否则线程之间的切换将会造成效率非常低下。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 其它考试类文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号