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・
版权声明:本文标题:浅谈JAVA语言的多线程技术 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1710814462a574467.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论