zhouJava教案11_第1页
zhouJava教案11_第2页
zhouJava教案11_第3页
zhouJava教案11_第4页
zhouJava教案11_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、 利用对象,可以将一个程序分割成相互独立的区域,通常也需要将一个程序转换成多个独立运行的子任务。像这样的子任务叫做线程。 在编写程序时,可将每个线程想象成独立运行,且都有自己专用的CPU。线程是进程内部单一的顺序控制流。因此,一个进程中可容纳多个同时执行的线程。 多线程的应用范围很广,它的最主要的一个用途就是构成一个反映灵敏的用户界面。l不同点 同样作为基本的执行单位,线程的划分比进程小,因此支持对线程的系统要比支持多进程的系统并发度高。 进程有自己独立的内存空间。相反线程共享内存,因此线程的通信比进程容易的多。 相对而言,进程是静态的,代表代码和数据存放的地址空间,而线程是动态的,每个线程代

2、表进程内的一个执行流。 线程的创建与进程的创建不同。创建进程之前要首先创建进程。创建进程要把程序段和数据段从磁盘调入内存。而线程的创建之需要创建一个线程控制就可以了。所以线程的创建不需要与磁盘交换数据。因此,多线程有利于提高效率。l联系 线程在进程之中,一个进程可以拥有多个线程; 一个进程中的所有线程共享进程状态,即它们驻留在完全相同的内存空间中。 线程的概念与并发性是紧密联系的。多线程的出发点就是为了提高系统的并发性,从而提高系统效率和资源的利用率。 注意: 所谓的并发执行,实际上从系统内部来看,仍是串行执行的,只不过由于操作系统的自动切换,从而给人一种并发执行的假像。 线程的运行是由“调度

3、程序”来调度的,所谓调度实际上就是分配处理器的资源。在多线程系统中处理器资源的分配有3中方法:l按时间片分配l协作式分配l抢占式分配l使得程序界面友好l使得程序执行效率高 Java内存支持多线程,它的所有类都是在多线程思想下定义的。 Java中的线程可以认为有三部分组成:l虚拟CPUl代码l数据一、线程体一、线程体 线程的所有活动都是通过线程的方法run()实现的。在一个线程建立并初始化之后,Java的运行时系统就会自动调用run(),正是通过它才使得建立线程的目的得以实现。 线程开始执行时,从它的run()方法中执行,该方法是线程的执行起点。 注:注:main()是应用程序的起点,是应用程序

4、的起点,init()是小应用程序的起点。是小应用程序的起点。 在Java中实现一个线程有两种方法,第一种是继承Thread类,覆盖它的run()方法,第二是实现Runnable接口实现它的run()方法。 1、继承继承Thread类类来构造线程来构造线程 类类Thread的构造方法:的构造方法:public Thread(ThreadGroup group, Runnable target, String name) 注:注: group指名线程所属的指名线程所属的线程组线程组; target为实际执行线程体的目标对象,它必须实现为实际执行线程体的目标对象,它必须实现Runnable接口;接口

5、; Name为线程名,为线程名,Java中的每个线程都有自己的名称;中的每个线程都有自己的名称; 这这3个参数都是可有可无的;因此可以得到下面不同的构造方法:个参数都是可有可无的;因此可以得到下面不同的构造方法:lpublic Thread()lpublic Thread(Runnable target, String name)ll是管理线程的一种机制;lJava的线程组不仅可以包含线程,还可以包含其它线程组,从而形成了一种树状结构;l通过将线程分组,可以很方便的管理属性相近的线程。创建线程组的一个例子: ThreadGroup myThreadGroup = new ThreadGroup

6、(“MyThreadG”); Thread myThread = new Thread(myThreadG, “a Thread”);通过通过继承继承Thread类类来构造线程的具体方法:来构造线程的具体方法: public class DoAnotherThing extends Thread public void run() / here is where you do something通过继承构造线程体的例子:P257-例11-1注:注: 用该方法生成线程,线程目标肯定为空,表示由这个用该方法生成线程,线程目标肯定为空,表示由这个实例来执行线程。实例来执行线程。2、实现实现Runna

7、ble接口接口来构造线程来构造线程 具体方法为:具体方法为:lpublic class DoSomething implements Runnable public void run() / here is where you do something l再用Thread类的一个构造方法, Thread(Runnable target, )生成线程。通过重写接口构造线程体的例子:P259-例11-2注:lRunnable接口中只定义了一个方法run()来作为线程体;l任何实现了Runnable接口的对象都可以作为一个线程的目标对象,置于Thread的构造方法的参数target中;l用Runna

8、ble接口来生成线程要比继承Thread类生成线程复杂一些,但由于Java不支持多重继承,利用Runnable接口是子类作为线程模板的唯一方法;3、两种方法的比较、两种方法的比较l直接继承直接继承Thread类的方法,程序编写简单,可直接操类的方法,程序编写简单,可直接操作线程;作线程;l实现实现Runnable接口的方法,接口的方法, 将将CPU、代码和数据分开,结构清晰;、代码和数据分开,结构清晰; 可以继承其他类;可以继承其他类; 在一个线程的生命周期中,它总处于某一种状态中。线程的状态表示了线程正在进行的活动及在这个阶段内线程能完成的任务。 注:线程执行调度队列(系统为所有可执行线程设

9、置了一个队列)1、创建状态、创建状态 一个线程刚创建时的状态。 Thread aThread = new Thread(target);2、可执行态、可执行态 线程进入创建状态后,通过调用start()方法,线程就进入了可执行态。 aThread.start();3、执行态、执行态 线程从可执行态到执行态是不受程序控制的,而是由操作系统进行调度。但程序可以设置线程的优先级线程的优先级来调节线程的执行机会。 注:注:线程的优先级是用数字来表示的,范围从1-10,即Thread.MIN_PRIORITY到Thread.MAX_PRIORITY。线程的默认优先级是5,即Thread.NORM_PRI

10、ORITY。在程序中可以通过GetPriority()来获得线程的优先级,或通过setPriority()来设定线程的优先级。 虽然程序不同控制线程变为执行态,但可以控制线程由执行态变成其他状态,方法有:l调用yield(),使线程从执行态变为可执行态,重新回到队列中去排队;l调用sleep(),使线程交出CPU资源,变为不可执行态,过一段时间后,线程重新回到可执行态;l调用wait(),线程同样进入不可执行态,只有当其他线程调用notify()方法时,线程才重新回到可执行态;4、不可执行态(阻塞态)、不可执行态(阻塞态) 线程处于某种原因,处于暂时不能执行的状态。产生阻塞的原因一般有以下几种

11、:l挂起线程(suspend())- resume()使挂起的线程恢复;l使线程睡眠(sleep()) - 线程睡眠时间过后自动解除;l线程本身调用wait()后,等待其它线程的唤醒; -其它线程调用notify()或notifyAll()使处于等待的线程恢复执行;lI/O操作尚未返回结果- 一旦I/O操作结束,线程进入可执行态;5、死亡态、死亡态 死亡态表示线程执行完毕,系统将其从线程队列中删除。进入死亡态有两种方式:l自然死亡,即因run()执行完毕而变成死亡态;l通过调用stop()实现结束线程; 除上述线程的5种状态外,有关线程的状态存在一种异常即IllegalTreadStateEx

12、ception。线程创建后,只能在相应的状态进行其容许的操作,若操作不当便会引起非法状态异常。l创建l启动l阻塞l死亡引起线程状态改变的方法有:l sleep()l yield()l join()l wait() 用于实现线程间通信的同步方法,它有两种方式: wait(); wait(long millis);l interrupt()lnotify()lnotifyAll()lsuspend()lresume()lstop()和线程有关的其他方法:lpublic final boolean isAlive();lpublic static Thread currentThread();lpu

13、blic final void setName();lpublic final String getName();lpublic static int activeCount();lpublic final ThreadGroup getThreadGroup();lpublic static void setDaemon();lpublic static boolean isDaemon();lpublic String toString();lpublic static int Enumerate(Thread tarray);lpublic final void checkAccess(

14、);先来看一个例子(售票问题 ): public class BookTickets public static void main(String args)Ticket tickets = new Ticket10;for(int i=0; i10; i+) ticketsi = new Ticket();Customer zhang = new Customer(“Zhang”,tickets,10);zhang.start(); Customer wang = new Customer(“Wang”,tickets,10);wang.start(); class Ticket stati

15、c int number = 0; int id; boolean isBooked; Ticket() id = number+; isBooked = false; boolean canBook() if( !isBooked ) isBooked = true; return true; else return false; class Customer extends Thread String name; Ticket tickets; int ticketNum; Customer(String name, Ticket tickets, int n) = n

16、ame; this.tickets = tickets; ticketNum = n; public void run() for(int i=0; iticketNum; i+)if(ticketsi.canBook() System.out.println(“Customer ”+name+”books the ”+i+” ticket.”); 临届区临届区 指在多线程程序设计中,不能被多个线程同时访问的代码段。同步 就是要当某一线程进入临届区时,其它的线程不容许再进入临届区。为此,Java专门引入了一个关键字: Sychronized Sychronized的使用有两种方式:lSynchronized(someClassInstance) lclass someClass Synchronized aMethod() 提到线程的同步执行,就不得不看看线程的异步执行。其实以前所提到的线程都是异步执行,即每个线程都包含了运行时所

温馨提示

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

评论

0/150

提交评论