JAVA-chap8-第八章线程概述_第1页
JAVA-chap8-第八章线程概述_第2页
JAVA-chap8-第八章线程概述_第3页
JAVA-chap8-第八章线程概述_第4页
JAVA-chap8-第八章线程概述_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章线程程序是一段静态的代码,是应用软件执行的蓝本进程是程序的一次动态执行过程,对应了从代码加载、执行到执行完毕的一个完整过程。作为蓝本的同一段程序,可以被多次加载到系统的不同内存区域分别执行,形成不同进程线程是比进程更小的执行单位,一个进程在执行过程中,可以产生多个线程,形成多条执行线索。每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念每个进程都有一段专用的内存区域,线程间可以共享内存,实现数据交换、实时通信和必要的同步操作一个进程中同时运行的多个线程可以类比为一个计算机上同时运行的多个进程:对于前者,各线程共享地址空间、打开的文件以及其他资源,只有堆栈和寄存器数据是独立的;对于后者,各进程共享物理内存、磁盘、打印机以及其他资源,但存储空间相互独立进程有单线程进程和多线程进程之分线程有时也称为轻量级(linghtweight)进程多线程是把多任务的原理应用到程序更底一层中进一步发展了这一原理进程有一组完整的属于自己的变量,而同一进程中不同线程共享这些数据创建和注销单个线程比进程所需的开销少得多与线程间的通信相比,进程间通信慢得多,要求也较高当调用java解释器启动一个应用时,首先是创建了一个进程,该进程中首先创建主线程;如果在另外一个命令窗口中调用java解释器启动另一个应用时,又创建了一个进程,该进程中仍然首先创建主线程……有效利用线程可以提高软件的执行效率Java语言对线程提供了方便的支持每天工商银行开始营业可以认为一个进程启动了,停止营业时该进程结束了;交通银行、农业银行也类似,都是不同的进程,各银行间有独立的数据库,跨行间业务虽可以进行,但相对困难工商银行所属的各分理处上的出纳柜台可以认为是该进程中的线程,各出纳柜台共享数据库,在不同分理处(或不同柜台)可以方便开展业务线程的管理和调度是难点和关键8.1线程的创建每个java程序都有一个缺省的主线程,对于Application,主线程是main()方法执行的线索;对于Applet,主线程指挥浏览器加载并执行小程序Java使用Thread类及其子类的对象来表示线程,要实现多线程,必须在主线程中创建新的线程对象线程生命周期中的五种状态:新建:创建时的状态,此时线程对象已经有了相应的内存空间和其它资源,并已被初始化线程生命周期中的五种状态:续就绪:调用start()方法后,进入线程对列排队等待CPU时间片,一旦轮到它来享用CPU资源时,就脱离创建它的主线程独立开始自己的生命周期;另外由原来处于阻塞状态的线程被解除阻塞后也进入就绪状态运行:就绪状态的线程被调度并获得处理器资源时,进入运行状态。每个线程对象都有一个run()方法,当线程对象被调度执行时,将自动调用本对象的run()方法线程生命周期中的五种状态:续阻塞:一个正在执行的线程在某些特殊情况下,例如被认为挂起或需要执行费时的输入输出操作时,将让出CPU并暂时终止自己的执行,进入阻塞状态。阻塞时它不能进入排队队列,只有当引起阻塞的原因被消除时,线程才能转入就绪状态,重新线程队列中排队等待CPU资源,以便从原来终止处开始继续执行死亡:处于死亡状态的线程不具有继续运行的能力。死亡原因有两个,即run()方法正常结束或提前强制性地终止,如执行stop()或destroy()方法线程调度依据优先级基础上的“先到先服务”原则新建就绪阻塞运行死亡线程的行为和功能体现在run()方法中,而Thread类中定义的run()方法什么也不做,因此直接用Thread类创建线程意义不大。创建有意义的线程对象关键是使其具有合适的、能被系统识别的run()方法(publicvoid)。一种方法是由Thread类派生子类,在该子类中改写run()方法,由该子类便可创建有意义的线程对象。java.lang包中除了有Thread类以外,还有一个接口Runnable,该接口中声明了一个run()方法,创建有意义的线程对象的另一种方法是,首先在一个实现了Runnable接口的类中定义新的run()方法,并利用该实现类创建一个对象,然后在创建线程对象时,把该实现类对象作为调用Thread类构造器的参数,系统会用该实现类对象的run()方法覆盖新创建线程对象的run()方法。线程的主要方法:启动线程的start()方法定义线程操作的run()方法使线程暂时休眠的sleep()方法判断线程是否未消亡的isAlive()方法:在调用stop()方法终止一个线程之前,最好先用该方法检查一下该线程是否存活,杀死不存在线程可能会造成系统错误。P220例,p222例8.2同步当两个线程需要同时操作同一对象时,可能会由于夹插操作而破坏数据。在多线程机制中,是通过给对象加锁来解决的。当某个对象被一个线程上锁后,仅有该线程能够访问该对象。8.2.1同步方法要使某个类能在多线程环境中使用,应该将类中某些适当方法说明为synchronized若线程对某对象调用synchronized方法,那么该对象就被加锁。此时若另一个线程再对该对象调用synchronized方法,后一个该线程将被阻塞直到加在该对象上的锁被释放(synchronized方法返回后)。当对一个已经由同一个线程加锁的对象调用synchronized方法时,执行该方法,但该对象上的锁要到最外层synchronized方法返回时才会被释放。构造器无需同步,它仅在创建对象时才被执行,而任何新创建对象只能在一个线程中创建。P225例类方法也可以通过使用该类的类范围内的锁来同步,两个线程不能同时对同一个类执行synchronized静态方法。当一个线程以同步静态方法对一个类加锁时,仍然可以调用该类对象的synchronized非静态方法,只有那些synchronized静态方法被阻塞。当扩展类改写父类的synchronized方法时,新方法可以是synchronized

,也可以不是。而调用父类的方法,它仍然是synchronized的,因此,扩展类的非synchronized方法并不会改变父类实际的synchronized行为。如果非synchronized

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论