- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十一章多线程处理-天津工程职业技术学院.ppt
11.1 线程的概念 许多程序都有一些独立的代码段,如果让这些代码段的执行时间彼此重叠,就可以获得更高的执行效率。线程就是为了实现这种重叠执行而引入的一个概念。请看如下几个概念: 程序:静态的计算机高级语言编写的代码。 进程:程序的一次执行。系统运行程序的基本 单位。 线程:程序中的部分代码的一次执行过程。 多进程:操作系统中多个程序同时执行。 多线程:程序中多个片断同时执行。 11.2 线程的基本结构与使用 一、线程的生命周期 1. Java的多线程机制: 使用多线程技术可以使系统同时运行多个执行体,这样可以加快程序的相应时间,提高计算机资源的利用率,提高整个应用系统的性能。 2. 线程的生命周期: 每个java程序都有一个主线程,即main()方法对应的线程,要实现多线程,必须在主线程中创建新的线程。Java中线程用Thread类及其子类的对象来表示。每个线程要经过新生、就绪、运行、阻塞和死亡5种状态,线程从新生到死亡的状态变化过程称为生命周期: 1)新生状态: 用new关键字和Thread类或其子类建立的一个线程对象后,该线程就处于新生状态,就有自己的内存空间,通过调用start方法进入就绪状态。 2)就绪状态: 该状态的线程具备了运行条件,但还没有分配到CPU,因而将进入线程队列,等待系统为其分配CPU。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。 3)运行状态: 进入运行状态的线程执行自己的run方法中的代码,直到调用其他方法而终止、或等待某资源或完成任务而死亡。 4)阻塞状态: 处于运行状态的线程在某种情况下,如执行了sleep方法或等待I/O设备等资源,将让出CPU并暂时终止自己的运行,进入阻塞状态。在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间到或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待CPU资源。当再次获得CPU时,便从原来的终止位置开始继续运行。 5)运行状态: 当完成工作或被另一个线程强制终止,即死亡。 1. 创建线程 2. 实现多个线程 3. 实现多个线程示例 三、Runnable接口 11.3 线程的管理 一、互斥: 1. 线程互斥:并发执行的多个线程在某一时间内只允许一个线程在执行以访问数据。 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 2. 应用的场合: 当两个或多个线程同时访问共享数据时,可能对数据进行读、写、修改、删除等操作时,应保证同时只有一个线程访问共享数据。 3. 线程互斥的实现机制 1)监视器(同步锁定): 线程进入监视器后其它线程则不能再进入监视器,直到被锁定的线程退出监视器,下一个线程才能进入监视器被执行。 如何产生监视器(同步互斥方法):通过在被多个线程所共享的方法前加上synchronized关键字定义出同步互斥方法,每一个拥有synchronized方法的对象都含有一个独立的监视器,只有某一个线程的synchronized方法执行完后其它线程的synchronized方法才能被执行。 public synchronized void myFun(){} 2)编程要点: ?? 应将访问共享数据的代码设计为synchronized方法; synchronized可以用来限定一个方法或一小段语句或整个类(可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问),即类方法,实例方法,一个方法中的任何代码块。 由于可以通过 private 关键字来保证数据对象只能被方法访问,所以只需针对方法提出一套同步锁定机制。通过synchronized 方法来控制对类中的成员变量(共享数据)的访问。 示例 3)synchronized代码块 synchronized 方法的主要缺陷在于,若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。 当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其
文档评论(0)