admin 管理员组

文章数量: 1184232


2024年3月19日发(作者:乱世三义在线)

2012年1月 

湖北成人教育学院学报 

Jan,2 0 1 2 

第18卷第1期 

Journal of HuBei Adult Education Institute 

、r01.18 N O.1 

浅谈JAVA语言的多线程技术 

贾家新 

(湖北工业大学,湖北武汉,430068) 

【摘 ̄]JAVA语言作为一种面向对向的编程语言,它具有平台独立性、安全性、网络化、多线程、面向对象等特点。 

其线程机制在实1 ̄-8i目中广泛应用而受到编程者的极大关心。本文就JAVA语言的多线程机制进行相关探讨。 

[关键词]面向对象;进程;多线程;同步 

[中图分类号】TP312 [文献标识码】A [文章编号]1673--3878(2012)01—O149—03 

1.弓l言 

//获得当前线程的名字 

JAVA语言是目前最流行的跨平台、网络开发语言。 

System.out.printla(Thread.currentThread().get.Name 

利用JAVA语言的多线程技术,可以有效地提高系统资源 

()); 

的利用率,进而提高系统的性能。 

} 

多线程是指在一个进程中同时存在几个执行体,按不 } 

同的执行线路共同工作的情况。JAVA是通过多线程机 

public classThreadDemol} 

制来支持多任务和并行处理。JAVA的多线程机制使得 

public static void main(String args[])f . 

编程人员可以很方便地开发出具有多线程功能、同时处理 

//实例化子类对象 

多个任务的应用。 

Threadl tll1=newThreadl(); 

2.JAVA的多线程机制 

//启动线程 

要编写安全高效的多线程程序,必须全面了解JAVA 

也1. ̄atrt(); 

的多线程机制,掌握线程的控制方法。同时要解决好线程 //获得当前线程的名字 

的同步和通信问题。 

System.out.prmttn(Thread.current'rhread().getName 

在JAVA程序中实现多线程有两种途径:一种是直接 

()); 

继承java. .Thread类并重写其中的run()方法;另外 

} 

种是实现Runnuble接口,并重写run()方法。 } 

(1)利用Thread类创建的子类实现多线程。 

此程序共有两个线程。第一是系统创建的线程,即主 

JAVA线程可以通过直接实例化Thread对象或实例 线程(main()方法),第二个则是用户定义线程,即tun() 

化继承自Thread类的子类对象来创建其他线程。在 方法,两个线程处于同等优先级。 

Thread子类中要重写run()方法,并在run()方法内部定 

(2)使用Runnbale接口实现多线程。 

义线程体的功能语句。步骤如下: 创建线程的另外一种方式是实现Runnahle接口,实 

O】首先定义Thread子类 

现RunnaNe接口的类必须使用Thread类的实例才能刨建 

o2创建Thread子类的线程对象 线程。通过Runnable接口创建线程的步骤如下: 

O3通过线程对象调用start()方法启动线程 01实现Runnable接口的子类 

c]ass hTread1 extends Thread{//Thread1类是Thread 02建立一个Thread子类对象,并将第一步实例化后 

类的子类 

的对象作为参数传人Thread类的构造方法 

public void run(){//重写run()方法 o3通过线程对象调用start()方法启动线程 

[收稿El期】2011—10—20 

149・ 

class Thread2 implements Runnable{//实现Rmmbsle 

其它线程打扰,就像在现实中,同一时间只完成一件事,可 

接口的类 

以不用担心这件事会被其它事情打扰,但如果程序中同时 

public void run(){ 

存在多个线程处理同—个对象资源,就好比现实中“两个 

System.out.println(Thread.eurrentThmad().getName 

人同时使用一个工具”,此时就需要控制,否则容易阻塞 

()); 

甚至产生错误。 

} 

为了避免多线程共享资源同时发生冲突的情况,只要 

} 

在线程使用资源时给该资源上一把锁,其它线程若想使用 

public class ThreadDemo2} 

这个资源必须等到锁被解除为止。锁解的同时另外一个 

public static void瑚lin(StriIlg srgs[]){ 

线程使用该资源并为这个资源上锁。也即是采取同步机 

Thread2 th=删nlread2(); 

制解决共享资源竞争。所谓同步机制指的是两个线程同 

//将实现Nunnable接口类的对象传人构造方法 

时操作一个对象时,应该保持对象数据的统一性和整体 

11lread th2=new Thread(th): 

性。JA、 语言提供synchomiz ̄关键字来实现对象锁。 

//启动线程 

当对象用synchronized修饰时,表明该对象在任意时刻只 

th2.sty(); 

能由一个线程访问。在JAVA中,使用synchronized有两 

System.out.println(Thread.currentThread().ge ̄ame 

种方式: 

()); (1)同步方法。 

} 

实现同步最简单的方式是使用synchronized关键字修 

} . 

饰需要同步的方法,此时一旦一个线程进入一个实例的任 

3.JAVA线程状态 

何同步方法,其它线程将不能进入同一实例的其它同步方 

在线程的生命周期中,它主要经过新建(New)、就绪 

法。但该实例的非同步方法仍然能够被调用。 

(Runnable)、运行(Running)、阻塞(Blocked)、和死亡 class Sharei 

(Dead)五种状态。它们之间相互转换关系如图: 

synchronized void print(StriI】g str){ 

(1)新建状态。 

System.out.print(“[”+str); 

当用Thread类或其子类创建一个线程对象时。该线 

町{ 

程对象就处于新建状态,系统为新线程分配内存空间和其 

1fhread.sleep(1ooo); 

他资源。 }catch(InterruptedE ̄eption e){ 

(2)就绪状态。 

} 

如果系统资源未满足线程的调度,线程就开始排队等 

System.out.printtn(“l”); 

待CPU的时间片,此时。线程就处于就绪状态。有3种情 

} 

况使得线程进入就绪状态:一是新建状态的线程被启动, 

} 

但不具备运行条件;二是正在处于运行的线程时间片结束 (2)同步块。 

或调用了yield()方法;三是被阻塞的线程引起阻塞的因 

实现同步另外一种有效的方法是使用同步块,只需将 

素消失了,进入排队队列等待CPU的调度。 

对该实例的访问语句放入一个同步块中,形式如下: 

(3)运行状态。 

Synchronized(object){ 

当线程被调度获得了CPU控制权时,就进入了运行 

//需要同步的语句 

状态。线程在运行状态时,会调用本对象的run()方法, 

} 

实际应用中一般在子类中重写父类的砌()方法来实现 

使用同步块可以确保只有当前线程能获得被同步对 

多线程。 

象的对象锁,并可以访问对象的方法: 

(4)阻塞状态。 

class Caller implements Runnable} 

当运行的线程被人为挂起或由于某些操作使得资源 

String str; 

不满足时,线程将暂时终止自己的运行,让出CPU,进入阻 

Sham share; 

塞状态。 

Thread thread; 

(5)死亡状态。 

public Caller(Share share。String ){ 

线程消亡(即处于死亡状态)有两种情况:一种是线 

this.shs.D ̄=share; 

程的run()方法执行完所有的任务正常地结束;另一种是 

this.str=str; 

线程被stop()方法强制终止。 

//实例化线程 

4.线程的同步 

thread=new Third(this); 

如果程序是单线程的,执行起来不必担心此线程会被 

htread.stm(); 

150・ 

} 

数。用于指明等待的时间,使用此种方式不需要notify() 

或notifyAU的唤醒。此方法只能一个同步方法中调用。 public void咖(){ 

//同步share对象 

synchronized(share){ 

share.print(s乜);} 

} 

} 

5.线程的通信 

(2)调用nD畸()方法时可以随机选择一个在该对象 

中调用wait()方法的线程。解除它的阻塞。 

(3)调用n0 ()方法可以唤醒等待该对象的所有线 

程。但唤醒时无法控制唤醒那个线程,唤醒线程完全由系 

统来控制。 

(4)notify()方法和noti ̄A]l()方法只能在同步方法 

线程同步是无条件地组织其他线程对相关资源的异 

或同步块内部使用。 

步访问,这种强大的控制可能带来资源的浪费和工作的不 

6.结束语 

协调。如对于“生产/消费”模型,往往会出现“供大于求” 

JAVA多线程的核心在于多个代码快并发执行,本质 

或“求大于供”的现象,而此对象的出现就是因为生产者 特征是各代码块之间的代码乱序执行的,我们的程序是否 

和消费者“沟通”不足弓l起的。可以使用线程通信使“生 

需要多线程机制来处理问题,关键在于代码块之间的特点 

产/消费”达到一个较合理的状态,即在没有产品的时候, 

是否需要多线程技术来进行处理。 

及时通知生产者,而在生产过剩的情况下及时通知消费 

者。 

参考文献: 

在JAVA中可以通过调用Object类定义的wait()、 

[1]邵峰晶.JAVA sE程序设计高级教程[M].电子工业 

notify()和notifyA]|()方法,使线程之间相互通知事件的 

出版社。2010. 

发生。要执行这些方法,必须拥有相关对象的锁。 

[2]肖艳.JAVA程序设计实用教程[M].清华大学出版 

(1)调用wait()方法可以让线程等待,并释放对象 

社.2010. 

锁,直到interrupt()方法中断它或者另一个线程调用 

[3]李刚.JAVA疯狂讲义[M】.电子工业出版社,2010. 

notify()或notifyAll通知它。Wait()方法也可以带一个参 (责任编辑:胡炼) 

七 七 女 K-" 

(上接第148页)重过程性和多元性。不但要注重研究成 

堂的总结,“通过此次课题研究,使我们知识了合理进行 

果,更要注重研究过程。不但要强调教师的赏识与鼓励, 

家庭预算开支的意义,为我们的父母找出了家庭开支中存 

更要注重学生的互相评价。 可把学生编成小组评价、也 

在的问题,也为自己做出了一周的花销预算,使我们懂得 

可使用局域网交流进行评价。教师在学生的评价中要引 

了勤俭节约。那么,最后老师还有个课题想问问大家,使 

导学生自主发现规律、总结不足,先要让学生自己为自己 

家庭财富增值的方法有哪些呢,请同学们回家后继续调 

纠错,随后进行同学间的互评,根据评价的结论,完善自己 

查,下节课我们再讨论这个问题……” 

的课题研究成果。在课题研究过程中,教师要时刻谨记自 

四、结语 

己的引导与组织职能,适时对课题进行一定的引申。在加 

在当前基础教育课程改革不断深化的形势下,在双主 

深学生对当前研究课题理觞的基础上,进一步培养学生继 

教学理论的基础上,实施主题实践教学模式具有重要的意 

续深入研究的思想,为终身学习习惯的养成打下良好的基 义。在这种新教学模式的实施中,教师只要抓好设计主 

础。例如:在学生完成《家庭一周消费情况统计表》课题 

题、确定研究方案,布置任务、组织课题实施,总结评价、对 

研究,把统计表插入Word中后。教师要为学生提前准备 学生予以奖励,这三个重要环节,基于双主理论的主题实 

好“小红花”进行奖励,分发给每个小组组长。并设定评 

践教学模式就会在小学信息技术课堂中发挥更大的作用。 

价的标准(能够在Word中顺利插入图表,完成数据的输 

入,给2朵小红花;能够选择合适的统计图,统计图一目了 

参考文献: 

然的反映家庭开支,给2朵小红花;能够根据统计图进行 

[1]马宁,余胜全.信息技术与课程整合的层次[J].教育 

分析,提出有自己对家庭开支的独特的想法,给3朵小红 

技术通讯,2008,(03):19—20. 

花)。第一步,要分成小组进行同学问进行讨论,先由每 

[2]高文.现代教学的模式化研究[M].山东教育出版社, 

位学生说出自己作品的优缺点。第二步,进行同学问的互 

2Ooo. 

相“找缺点”、“找问题”,进行学生间的互评,小组长的协 

[3]祝智庭.现代教育技术——走进信息化教育[M].高 

调和教师的组织下,把小红花发给每位学生。每位学生根 等教育出版社,2Ooo. 

据自己的问题进行更正。第三步,在全班范围内进行作品 

(责任编辑:毛维) 

的观摩,学生做课题研究感想体会发言。最后。教师做课 

151・ 


本文标签: 线程 对象 方法 进行 学生