维普资讯 http://www.cqvip.com 第24卷第3期 2007年9月 南宁师范高等专科学校学报 VO L.24 NO.3 Sept.2007 JAVA语言多线程机制及其应用 赵智 (广西教育学院教学与计算机科学系.广西南宁530023) 摘 要:多线程是面向对象程序设计语言中的重要的概念,它是人们掌握面向对象程序设计方法的关键之一。本文 针对JAVA语言中多线程机制.结合应用实例.说明多线程在多媒体应用的一些经验及使用过程中应注意的问题.时掌握 Java语言的多线程鳊程方法的人来说.具有一定的参考价值。 关键词:Java;多线程;应用 中图分类号:TP3l1.5l 文献标识码:A ZhaoZhi 文章编号:1008—696X(2007)03-0145-03 Multi.thread Mechanism in Java and the Application (Guangxi College of Education。Nanning.Guangxi 530023) Abstract:Multi.thread,important in OOP language,is ofle ofthe keys to master COE In view of multi・thread mechanism in Java and mtcgrat ̄with practical examples,this paper expounds experience and problems in applying multi・thread in multimedia, which is valuable for multi・thread programming in Java. Key words:Java;multi—thread;apply 1.线程与多线程概述 相当一部分程序是单线程的.也就足一个程序只有一条 从头至尾的执行路线。现实世界中.很多过程都具有多种途 程 创建普通类的对象的操作是一样.先定义Thread类的 一个子类,在该子类中重写runO方法。用这样的Thread子 创建和启动一个线程的语句: Thread oHl=newThread0;,庐明一个对象实例.即创 类去创建一个实例对象。该对象就足一个线程。 径同时运作。如文件服务,可能需要同时处理多个客户机的 请求。 多线程是指同时存在几个执行体,按几条不同的执行路 线共同工作的情况。Java语言的一个重要功能特点就是内置 对多线程的去持,它使得编程人员可以很方便地开发出具有 多线程功能。能同时处理多个任务的功能强大的应用程序。 建一个线程; obj1.runO;,,用Thread类中的ran0方法启动线程; 启动线程。也就是启动线程的run0方法。Thred类中 a的ran0方法没有任何操作语句.所以这个线程没有任何操 作。要使线程实现预定功能。必须重写ran0方法。编写线 程体的ran0方法后.启动线程就是启动子类中重写的ran0 方法。 2.创建线程对象的两种方法 Java语言中,实现线程有两种方式,第一种是生成 Thread类的子类.并定义该子类自己的FilEt方法.线程的任 务在方法mEt中实现。用这种方法实现线程局限.即:如果 3.线程的状态及相互转换 每个线程都有着各自的特定状态。一个线程处于以下5 种状态之一。 定义的类已经是其他类的子类.而Java不允许多重继承. 这种情况下.用第二种实现线程的方法.即实现RunEtable 接口.通过实现Runnable接口中的lull方法来完成该线程 的功能。 3.1新生状态 线程已被创建但尚未执行。当线程处于“新生”状态时. 只是一个空线程对象.它还没有分配到系统资源.因此只能 通过继承Thread类创建线程 Java为我们提供了线程类Thread来创建线程。创建线 启动或终止它.任何其他操作都会引发异常。 收稿日期:2007—06—19 作者简介t赵 ̄(1962一).男(壮族),广西教育学院数学与计算机科学系讲师.主要从事计算机教学工作。 145_一 一维普资讯 http://www.cqvip.com JAVA语言多线程机制及其应用 3.2准备运行状态 线程的生命周期从准备运行状态开始:一个线程已实例 化并已启动.JVM可以分配时间片给这个线程.以使其在 CPU上运行。 3.3运行态 —作者\赵ptiono 智 等待和通知 等待和通知提供了在同一对象一12同步的线程之问的通 信方式。为了进一行通信,线程在共享对象L执行wait0和 notifyO(或nofifyAllO)方法。这些final方法定义在Object类中, 因此它们被所有对象继承。 线程处于运行状态.它意味着线程正在执行,线程占用 着处理机,了E执行它的代码。对只有一个处理机的计算机来 说,任何时刻只能有一个线程占用处理机。 3.4死亡状态 一4.Thread的方法 Thread类的各个方法及它们的用法。 ifnM boolean isAiive0此方法可用于确定线程为活动线 个线程执行结束.不能再被启动。如果线程处于死亡 状态.就不再能够运行。 程或死亡线程。如果线程已启动但还没有终止,那么它处理 3.5不可运行状态 活动状态,也就是说。不是处于死亡状态。 根据具体情况, 在运行的线程可以转换至不可运行状 ifnal int getPriofity0方法:返回当前线程的优先级。 态。线程保持不可运行状态.直到发生特定的状态转换。线 ifnal viod setPriofity(int newPriority)方法:改变其优先级。 程不能直接从运行状态转换至不可运行状态,而是应该先转 优先级的取值范围应位于两个整数之间,对于本线程,可以 换至准备运行状态。以下是不可运行状态: 设置newPriority和最高优先级。 a淋眠:线程休眠一定的时间; static void yield()方法:使线程暂时停止运行,从而允许 b)I/O阻塞:线程等阻塞运算完成(I,0阻塞); 其他线程运行。 c)阻塞等待挂起完成:线程等待其他线程的完成; static void sleepOong millisec)throws d游待通知:线程等待其他线程通知; InterruptedException:当前线程休眠指定的时问,然后继续 e)阻塞以获得锁定:线程进行等待,以获得对象的锁定。 运行。 线程状态间的转换 ifnal void joinO throws InterruptedExcepfion 运行和挂起 ifnal void join(1ong millisec)throws InterruptedException start0方法被调用后.线程的生命周期就从准备运行状 调用以I:两个方法中的任何一个.都将进行等待,而且 态开始了。进入准备运行状态事.线程有资格运行.即线程 不会返同。 到线程完成或者超过指定时间。 等待获得CPU时问。线程调度器决定哪个线程可以运行并 void interrupt()方法:中断调用此方法的线程。在等待通 决定其运行时间。 知、休眠或阻塞以等待挂起完成的状态下.线程将收到 准备运行状态 运行状态之问的转换:调用定义在 ImerruptedException异常。 Thread类中的yield0方法将会导致当前线程的运行状态转换 为准备运行状态,从而释放CPU。然后由线程调度器决定何 5.线程的优先级 时再次运行此线程。如果没有其他线程处于准备运行状态. 对于多线程程序.每个线程的重要程度不尽相同。如多 那么此线程继续运行。如果有其他线程处于准备运行状态. 个线程在等待获得CPU时间时.往往需要优先级高的线程 这些线程的优先级将决定哪个线程可以运行。 优先抢占到CPU时间得以执行;又如多个线程交替执行时, 通过调用静态方法yield0。正在运行的线程使其他处于 优先级决定了级别高的线程得到CPU的次数多一些且时间 准备运行状态的线程有机会运行。这种机制是有用的。一个 长一 ,即高优先级的线程处理的任务效率就高一些。 典型的例子就是.当用户发出命令.以进行CPU密集型的 Java中线程的优先级从低到高以整数1 10表示,共分 计算时.用户可以通过点击“取消”按钮进行取消。如果计 为10级.设置优先级是通过调用线程对象的setPriority0方 算线程霸占了CPU,用户单击“取消”终止计算。进行这种 法。设置优先级的语句为: 计算的线程应该逐步进行计算。并在各步之问挂起。以允许 线程名.setPriority(优先级); 其他线程运行。 优先级在线程启动前设置.也可以在启动后进行设置, 休眠和唤醒 以满足不同的优先级需求。 调用Thread类中的静态方法sleep0将会导致当前正在 运行的线程暂停运行并转至休眠状态。此方法并不释放线程 6.线程的同步控制 的锁定。在转换至准备运行状态以获得运行机会之前,线程 一个Java程序的多线程之间可以共享数据。当线程以 将休眠,休眠时问在方法的参数中给定。如果线程在休眠时 异步方式访问共享数据时,有时候足不安全的或者不符合逻 被中断.当它醒来并运行时。将抛出一个Interrupted Exce 辑的。比如。同一时刻一个线程在读取数据,另外一个线程 一l46-~ 维普资讯 http://www.cqvip.com
JAv^语言多线程机制及其应用 作者\赵智 在处理数据.当处理数据的线程没有等到读取数据的线程读 取完毕就去处理数据,必然得到错误的处理结果。如果我们 采用多线程同步控制机制,等第一个线程读取完数据,第二 个线程才能处理该数据,就会避免错误。 在Java中可以用关键字synchronized声明对共享数据操 作的方法。用synchronized声明的方法即为同步方法。Java public void paint(Graphics g) f g.drawString(”播放音乐”,150.15); for(int i=0;i<3;i++) I 中有一个同步模型——管程.负责管理线程对对象中的同步 方法的访问,它的原理是:赋予该对象唯一的一把“钥匙”, 当多个线程进入对象,只有取得该对象钥匙的线程才可以访问同步方法.其他线程在该对象中等待,直到该线程用waitO 方法放弃这把钥匙.其他等待的线程抢占该钥匙后才可得以 执行,而没有取得钥匙的线程仍被阻塞在该对象的等待中。 this); g.drawlmage(m脚,25,25.200,200, try I l Ca Thread.sleep(1 000); 7.多线程应用实例 以下是一个应用多线程同时播放音乐和显示图像的一 l l 个实例,预先准备三个jPg文件,取名为m[O1、mill、mr21, 一public voidran0l】 个rap3文件,放在当前目录,程序如下: import java.applet. ; import java.州. ; public class Movie extends Applet implements Runnable 8.结束语 Java多线程技术除了多媒体编程的应用外,它在网络通 迅、数学计算和实时控制方面也有着很广阔的应用前景。 多线程使应用程序可以同时进行不同的操作,处理不同 l Image mfl; AudioClip aa; Thread t: 的事件。多线程机制中,不同的线程处理不同的任务.他们 之间互不干涉.不会由于一处等待影响其他部分。 public void initO I m=new m[31; for(int i=o:i<3.i++) m[il=getlmage(getCodeBase0,(i+1)+".jpg”); aa=getAudioClip(getCodeBase0.”music.mp3”): aa.phy0; j public void start0 I if(t==nul1) I t=new Thread(this); t.startO; } 参考文献: …殷兆辟|Java语言程序设计IMI.北京:高等教育出版社,2002。 I2I任学群译.Java认证考试指南lMl■b京:清华大学出版社.2005. 13J朱仲杰.Java全方位学习lM1.北京:机械工业出版社.2005. 14I吴中福.钟诚.汪学明.等.Java语言及其应用lMj.重庆:重庆大学出 版社.2001. 1Sl表兆山.刘学田.苗沛荣译.Java程序ilff ̄版社.2004. lM1.北京:机械工业出 f611&lTimothr Budd三方四方工作窒译.面向对象Ja 嫡程思想fMi.北 京:清华大学出版社.2002. (责任编辑:覃庆甫责任校对;赵美斌) 一l47._-