您好,欢迎访问三七文档
ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程2019/12/201第十一章多线程ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程第十一章多线程•11.1多线程概念•11.2多线程的创建•11.3线程的控制•11.4互斥与同步•11.5线程组ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程11.1多线程基本概念•以前所编写的程序,每个程序都有一个入口、一个出口以及一个顺序执行的序列,在程序执行过程中的任何指定时刻,都只有一个单独的执行点。•事实上,在单个程序内部是可以在同一时刻进行多种运算的,这就是所谓的多线程(这与多任务的概念有相似之处)。•一个单独的线程和顺序程序相似,也有一个入口、一个出口以及一个顺序执行的序列,从概念上说,一个线程是一个程序内部的一个顺序控制流。•线程并不是程序,它自己本身并不能运行,必须在程序中运行。在一个程序中可以实现多个线程,这些线程同时运行,完成不同的功能。3ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程程序、进程与线程•“程序”(Program)是保存在存储设备上的文件;•“进程”(Process)是正在计算机中执行的程序;•线程(Thread)是进程中某个单一顺序的控制流或者一条执行路径。ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程多线程基本概念5ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程多线程基本概念•从逻辑的观点来看,多线程意味着一个程序的多行语句同时执行,但是多线程并不等于多次启动一个程序,操作系统也不会把每个线程当作独立的进程来对待:n两者的粒度不同,是两个不同层次上的概念。进程是由操作系统来管理的,而线程则是在一个程序(进程)内,不同进程的代码、内部数据和状态都是完全独立的,而一个程序内的多线程是共享同一块内存空间和同一组系统资源,有可能互相影响。n线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。2019/12/206ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程多线程基本概念7文件输入输出装置各种系统资源数据区段程序区段只有一个地方在执行文件输入输出装置各种系统资源数据区段程序区段同时有数个地方在执行传统的进程多线程的任务ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程多线程的优势•用户可以获得更好交互。•两个线程的切换时间少。•由于同一个进程内的线程共享内存和文件,所以线程之间互相通信必须调用内核。•线程能独立执行,能充分利用和发挥处理机与外围设备并行工作的能力。•可以利用多处理器。•可以简化对象模型。8ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程多线程示例ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程多线程示例ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程2019/12/201111.2线程的创建11.2.1通过扩展Thread类创建线程11.2.2通过实现Runnable接口创建线程ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程•在JAVA语言中实现多线程编程方法有两种途径,分别是:继承Thread类和实现Runnable接口。线程的行为由线程体决定,线程体由run()方法定义,运行系统通过调用该方法实现线程的具体行为。ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程创建线程的方式13Java的线程是通过Java的软件包Java.lang中定义的类Thread来实现的。当生成一个Thread类的对象之后,就产生了一个线程,通过该对象实例,可以启动线程、终止线程、或者暂时挂起它等。Thread类本身只是线程的虚拟CPU,线程所执行的代码(或者说线程所要完成的功能)是通过方法run()(包含在一个特定的对象中)来完成的,方法run()称为线程体。实现线程体的特定对象是在初始化线程时传递给线程的。在一个线程被建立并初始化以后,Java的运行时系统就自动调用run()方法,正是通过run()方法才使得建立线程的目的得以实现。通常,run()方法是一个循环,例如一个播放动画的线程要循环显示一系列图片。有时,run()方法会执行一个时间较长的操作,例如下载并播放一个JPEG格式的电影。ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程11.2.1通过扩展Thread类创建线程14定义一个线程类,它继承类Thread并重写其中的方法run()。这时在初始化这个类的实例时,目标对象target可以为null,表示这个实例本身具有线程体。由于Java只支持单继承,用这种方法定义的类不能再继承其他类。ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程Thread类提供的构造方法•Thread类提供了7种重载的构造方法,分别是:–PublicThread()–PublicThread(Runnabletarget)–PublicThread(RUnnabletarget,Stringname)–PublicThread(Stringname)–PublicThread(ThreadGroupgroup,Runnabletarget)–PublicThread(ThreadGroupgroup,Stringname)–PublicThread(ThreadGroupgroup,Runnabletaget,Stringname)ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程创建线程的方式16先来看看线程对象的初始化,类Thread的构造方法如下:publicThread(ThreadGroupgroup,Runnabletarget,Stringname)group指明了线程所属的线程组;target是线程体run()方法所在的对象;name是线程的名称。target必须实现接口Runnable。在接口Runnable中只定义了一个方法voidrun()作为线程体。任何实现接口Runnable的地对象都可以作为一个线程的目标对象。类Thread本身也实现了接口Runnable,因此,上述构造方法中各参数都可以为null,并且可以有两种方法构造用户自己的run()方法。ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程2019/12/2017通过类Thread构造线程类•线程程序执行代码publicvoidrun()•启动线程publicvoidstart()ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程创建线程的方式181.classSimpleThreadextendsThread2.{3.publicSimpleThread(Stringstr)4.{5.super(str);6.}7.publicvoidrun()8.{9.for(inti=0;i10;i++)10.{11.System.out.println(i++getName());12.try{13.sleep((int)(Math.random()*1000));14.}catch(InterruptedExceptione){15.}16.}17.System.out.println(DONE!+getName());18.}19.publicstaticvoidmain(Stringargs[]){20.SimpleThreadaa=newSimpleThread(SimpleThread);21.aa.start();22.}23.}ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程Thread示例classMyThreadextendsThread{publicMyThread(){//自定义线程类的构造方法}publicvoidrun(){//覆盖run()方法for(inti=0;i10;i++){System.out.println(“新线程”);}}publicstaticvoidmain(String[]args){MyThreadmt=newMyThread();//定义线程对象实例mt.start();//启动线程}}【例11-1】简单Thread示例【例11-2】多线程累加和示例ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程11.2.2通过实现Runnable接口创建线程20在JAVA中只有单继承,即只有一个直接父类。当程序已经继承了其他父类的时候,还需要实现多线程设计,就必须使用Runnable接口来实现线程类的定义,并在该类中定义run()方法。提供一个实现接口Runnable的类作为线程的目标对象。在初始化一个Thread类或子类生成线程实例时,把目标对象传递给这个线程实例,由该目标对象提供线程体run()方法。这时,实现接口Runnable的类还可以再继承其他类。实际上,在真实的编程应用中实现Runnable接口更常用。ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程Runnable接口构造方法•Thread类中带有Runnable接口的构造方法有–PublicThread(Runnabletarget)–PublicThread(Runnabletarget,Stringname)–PublicThread(Stringname)–PublicThread(ThreadGroupgroup,Runnabletarget)–PublicThread(ThreadGroupgroup,Runnabletarget,Stringname)ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程2019/12/2022通过接口Runnable构造线程类•类声明形式publicclassAextendsBimplementsRunnable{//...publicvoidrun(){//...}}ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程2019/12/2023通过接口Runnable构造线程类•构造和启动线程的方法Aa=newA();Threadt=newThread(a);t.start();A为实现接口Runnable的类ProgrammingLanguageJava:西安邮电学院计算机学院——朱辉第十一章——多线程241.publicclassClockextendsjava.applet.AppletimplementsRunnable2.{3.ThreadclockThread;4.publicvoidstart()5.{6.if(clockThread==null)7.{8.clockThread=newThread(this,Clock);9.clockThread.start();10.}11.}12.publicvoidrun()13.{14.while(clockThread!=null)15.{16.r
本文标题:第11章_多线程.
链接地址:https://www.777doc.com/doc-2153112 .html