java程序设计教程(第2版)机械工业出版社 ch07.ppt_第1页
java程序设计教程(第2版)机械工业出版社 ch07.ppt_第2页
java程序设计教程(第2版)机械工业出版社 ch07.ppt_第3页
java程序设计教程(第2版)机械工业出版社 ch07.ppt_第4页
java程序设计教程(第2版)机械工业出版社 ch07.ppt_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、第七章 Java的多线程程序设计,7.1 线程的概念 7.1.1 进程和线程 进程是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。进程是存储器、外设等资源的分配单位。也是处理器的调度对象。 但每个进程有自己独立的内存空间和资源,进程之间不会共享系统资源。 线程就是比进程更小的运行单位,一个进程可以被划分成多个线程。在一个支持线程的系统中,线程是处理器的调度对象。 一个进程中的线程共享进程的资源。线程之间的通信要比进程之间的通信方便。,7.1.2线程和多任务(multi task) 多任务是指在系统中可以同时运行多个程序,如果只有一个处理器,在每一时刻只有一个进程的一条指令被执行

2、。可以使这些任务交替执行,由于间隔的时间短,这些程序看上去好像在同时运行。 如果将进程再划分成进线程,每个线程轮流占用处理器,可以减少并发控制的时间 。 windows98/NT/2000操作系统就是将进程划分为线程来支持多任务的并发处理。 7.1.3 Java对多线程的支持 Java通过对Thread类的继承或对Runnable接口的实现,实现多线程编程。,7.2 线程的创建 为了将进程划分成线程,要在程序中创建多个线程对象。 Thread类用来创建和控制线程。一个线程要从run方法开始执行,run方法的声明在java.lang.Runnable接口中。 每个程序至少有一个主线程。,7.2.

3、1 Runnable接口 在Runnable中,只声明了一个方法run public void run( ); 已实现的run方法称为该对象的线程体。 在创建并启动了一个线程后,run方法被系统自动调用。 7.2.2 Thread类 在Thread类中,run方法被实现为空方法。Thread类的声明格式如下: public class Thread extends Object implements Runnable Thread中的方法如下:,构造方法 public Thread( ); public Thread(String name) public Thread(Runnale tar

4、get) public Thread(Runnable target, String name) public Thread(ThreadGroup group, Runnable target) public Thread(ThreadGroup group, String name) public Thread(ThreadGroup group, Runnable target, String name) 其中:name是线程名; target是执行线体的目标对象,它必须实现 Runnable的run方法; group是线程所属的线程组的名字。,Thread的成员方法 public fi

5、nal String getName( ) /返回线程名 public final void setName(String name) /将线程的名字设置为name public void start( ) /启动已创建的线程对象 public final Boolean isAlive( )/线程是否已启动 public final ThreadGroup getThreadGroup( ) /返回线程所属的线程组 public String toString( ) /以字符串的形式得到线程的 /名字、优先级和所属的线程组等信息,Thread的静态成员方法 public static Thr

6、ead currentThread( ) /返回当前正在执行的线程对象 public static int activeCount( ) /返回当前线程组的活动线程个数 public static int enumerate( Thread tarray) /将当前线程组中的活动线程, /包括子线程复制到数组tarray中,7.2.3创建线程的方法 继承Thread方法创建线程 从Thread类派生出子类,在此子类中覆盖Thread的run方法。 实现Runnable接口创建线程 创建类实现接口Runnable的run方法,以此类的对象为目标对象,创建了线程对象。,7.3 线程的状态与控制 每

7、个线程都存在一个从创建、运行到消亡的生命周期。 在生命周期中,一个线程具有创建、可运行、运行中、阻塞和死亡五种状态。 Thread类中的方法可以改变线程的状态。,7.3.1线程的状态 1. 创建状态(new thread) 2. 可运行状态(runnable) 3. 运行中状态(running) 4. 阻塞状态(Not runnable) 5. 死亡状态(dead) 方法isAlive用来返回线程的状态。如果此方法返回true,线程处于、或Not runnable这几种状态之一。如果此方法的返回false,线程处于new thread或dead状态。,7.3.2对线程状态的控制 使线程进入睡眠

8、的sleep方法 public static void sleep(long millis) throws InterruptedException 其中millis是指定的睡眠时间。 暂停线程的yield方法 public static void yield( ) yield方法暂停线程的执行。 join方法 public final void join( ) throws InterruptedException public final void join(long millis) throws InterruptedException join方法使本线程暂停执行,直到调用该方法的线程

9、执行结束后再继续执行本线程。,wait和notify(notifyall)方法 这几个方法在java.lang.Object中。 wait方法使当前线程进入阻塞状态,notify(notifyall)方法唤醒等待队列中的其它线程,使它们进入可运行状态,和中断线程有关的方法 public void interrupt( ) public void boolean isInterrupted( ) public statick void boolean interrupted( ) 方法interrupt为线程设置一个中断标记,当run方法运行时,用isInterrupted方法检测此标记。 静态

10、方法interrupted检测线程是否被中断,如果是则清除中断标记并返回true。,7.4 线程的优先级和调度 7.4.1线程的优先级 线程的优先级用整数110表示。最低和最高的优先级是1和10。默认的优先级为5。也可用Thread类的公用静态常量表示。 public static final int NORM_PRIORITY=5 public static final int MIN_PRIORITY=1 public static final int MAX_PRIORITY=10 方法getPriority用于获得线程优先级 public final int getPriority(

11、) 方法setPriority用于设置线程优先级: public final setPriority(int newPriority),7.4.2线程的调度 线程的调度是负责线程排队以及CPU在线程之间的分配。被选中的线程获得处理器进入运行状态。 线程的调度采用占先原则。 对于优先级相同的线程,有分时和独占两种调度方式。,7.5 线程组 7.5.1线程组 线程组把多个线程集合为一个对象。 java.lang包中的ThreadGroup类实现了线程组的创建和对线程组的操作。对线程组的操作就是对线程组中的所有线程的操作。 线程组可以形成树形结构。在java应用程序中,最高层的组就是main线程组。

12、,7.5.2 ThreadGroup类 ThreadGroup的构造函数 public ThreadGroup(String name) 创建一个名字为name的线程组。 public ThreadGroup(ThreadGroup parent,String name) 在线程组parent中创建一个线程组name。,ThreadGroup的方法 public final String getName( ) 返回线程组的名 public final ThreadGroup getParent( ) 返回线程组的父线程组 public int activeCount( ) 返回当前线程组中活动

13、线程的个数 public int enumerate(Thread list ) public int enumerate(ThreadGroup list ) 将当前线程组中的活动线程复制到线程数组或线程组数组中 public int enumerate(Thread list ,boolean recurse) public int enumerate(ThreadGroup list ,boolean recurse) 将当前线程组中的活动线程(包括子线程中的)复制到线程数组或线程组数组中,7.6线程的同步 7.6.1线程的同步机制 当多个线程对共同的数据进行操作时会产生一些问题。 Ja

14、va语言提供了线程的同步控制机制。 对共享数据的线程的“互斥”锁定: 对于共享的数据对象,在任何时刻只能有一个线程对它进行操作。这样可以保证数据的完整和一致。 传送数据的线程的同步运行: 为了保证传送的数据能及时正确收到,需要传送数据的线程必须同步运行,7.6.2共享数据的互斥锁定 可以用关键字synchronized使一段代码或一个方法锁定一个对象。 用synchronized使代码锁定对象的格式如下: synchronized() 用synchronized锁定方法的格式如下: synchronized 或: synchronized(this) ,7.6.3数据传送时的同步控制 方法的锁定并不能保证两种不同的方法互斥

温馨提示

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

评论

0/150

提交评论