预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共18页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Java面向对象程序设计 STYLEREF"标题1"\*MERGEFORMAT第9章Java多线程编程 第9章Java多线程编程 Java语言的一个重要特点是内在支持多线程的程序设计。多线程是指在单个的程序内可以同时运行多个不同的线程完成不同的任务。多线程的程序设计具有广泛的应用。本章主要讲授线程的概念、如何创建多线程的程序、线程的生存周期与状态的改变、线程的同步与互斥等内容。 9.1线程与线程类 9.1.1线程的概念 线程的概念来源于计算机的操作系统的进程的概念。进程是一个程序关于某个数据集的一次运行。也就是说,进程是运行中的程序,是程序的一次运行活动。 线程和进程的相似之处在于,线程和运行的程序都是单个顺序控制流。有些教材将线程称为轻量级进程(lightweightprocess)。线程被看作是轻量级进程是因为它运行在一个程序的上下文内,并利用分配给程序的资源和环境。 作为单个顺序控制流,线程必须在运行的程序中得到自己运行的资源,如必须有自己的执行栈和程序计数器。线程内运行的代码只能在该上下文内。因此还有些教程将执行上下文(executioncontext)作为线程的同义词。 所有的程序员都熟悉顺序程序的编写,如我们编写的名称排序和求素数的程序就是顺序程序。顺序程序都有开始、执行序列和结束,在程序执行的任何时刻,只有一个执行点。线程(thread)则是进程中的一个单个的顺序控制流。单线程的概念很简单,如图9.1所示。 多线程(multi-thread)是指在单个的程序内可以同时运行多个不同的线程完成不同的任务,图9.2说明了一个程序中同时有两个线程运行。 一个线程 两个线程 图9.1单线程程序示意图图9.2多线程程序示意图 有些程序中需要多个控制流并行执行。例如, for(inti=0;i<100;i++) System.out.println("RunnerA="+i); for(intj=0;j<100;j++) System.out.println("RunnerB="+j); 上面的代码段中,在只支持单线程的语言中,前一个循环不执行完不可能执行第二个循环。要使两个循环同时执行,需要编写多线程的程序。 很多应用程序是用多线程实现的,如HotJavaWeb浏览器就是多线程应用的例子。在HotJava浏览器中,你可以一边滚动屏幕,一边下载Applet或图像,可以同时播放动画和声音等。 9.1.2Thread类和Runnable接口 多线程是一个程序中可以有多段代码同时运行,那么这些代码写在哪里,如何创建线程对象呢? 首先,我们来看Java语言实现多线程编程的类和接口。在java.lang包中定义了Runnable接口和Thread类。 Runnable接口中只定义了一个方法,它的格式为: publicabstractvoidrun() 这个方法要由实现了Runnable接口的类实现。Runnable对象称为可运行对象,一个线程的运行就是执行该对象的run()方法。 Thread类实现了Runnable接口,因此Thread对象也是可运行对象。同时Thread类也是线程类,该类的构造方法如下: publicThread() publicThread(Runnabletarget) publicThread(Stringname) publicThread(Runnabletarget,Stringname) publicThread(ThreadGroupgroup,Runnabletarget) publicThread(ThreadGroupgroup,Stringname) publicThread(ThreadGroupgroup,Runnabletarget,Stringname) target为线程运行的目标对象,即线程调用start()方法启动后运行那个对象的run()方法,该对象的类型为Runnable,若没有指定目标对象,则以当前类对象为目标对象;name为线程名,group指定线程属于哪个线程组(有关线程组的概念请参考9.6节)。 Thread类的常用方法有: publicstaticThreadcurrentThread()返回当前正在执行的线程对象的引用。 publicvoidsetName(Stringname)设置线程名。 publicStringgetName()返回线程名。 publicstaticvoidsleep(longmillis)throwsInterruptedException publicstaticvoidsleep(longmillis,intnanos)throwsInterruptedExce