




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第12章Java的线程,学习内容,线程简介多线程的互斥与同步,12.1线程简介,随着计算机的飞速发展,个人计算机上的操作系统也纷纷采用多任务和分时设计。将早期只有大型计算机才具有的系统特性带到了个人计算机系统中。一般可以在同一时间内执行多个程序的操作系统都有进程的概念。1.进程:每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大。2.线程:轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。3.多进程:在操作系统中,能同时运行多个任务程序。4.多线程:在同一应用程序中,有多个顺序流同时执行。,线程的概念模型,Java中的线程由三部分组成:1.虚拟的CPU,封装在java.lang.Thread类中;2.CPU所执行的代码,传递给Thread类;3.CPU所处理的数据,传递给Thread类;,线程体,Java的线程是通过java.lang.Thread类来实现的。当我们生成一个Thread类的对象之后,一个新的线程就产生了。下面的几个构造方法:publicThread();publicThread(Runnabletarget);publicThread(Runnabletarget,Stringname);publicThread(Stringname);publicThread(ThreadGroupgroup,Runnabletarget);publicThread(ThreadGroupgroup,Stringname);其中,group指明该线程所属的线程组;target实际执行线程体的目标对象,它必须实现接口Runnable;name为线程名。,两种方法实现线程体:,(一)定义一个线程类,它继承线程类Thread并重写其中的方法run();(二)提供一个实现接口Runnable的类作为一个线程的目标对象;,线程体的构造,1通过继承类Thread构造线程体:参考示例:SimpleThread.java2通过接口构造线程体:参考示例:Clock.java,构造线程体的两种方法的比较:,1.使用Runnable接口1)可以将CPU,代码和数据分开,形成清晰的模型;2)还可以从其他类继承;3)保持程序风格的一致性。2.直接继承Thread类1)不能再从其他类继承;2)编写简单,可以直接操纵线程,无需使用Thread.currentThread()。,线程的状态,线程的状态续,1.创建状态(newThread)执行下列语句时,线程就处于创建状态:ThreadmyThread=newMyThreadClass();当一个线程处于创建状态时,它仅仅是一个空的线程对象,系统不为它分配资源。2.可运行状态(Runnable)ThreadmyThread=newMyThreadClass();myThread.start();,线程的状态续,3.不可运行状态(NotRunnable)进入不可运行状态的原因有如下几条:1)调用了sleep()方法;2)调用了suspend()方法;3)为等候一个条件变量,线程调用wait()方法;4)输入输出流中发生线程阻塞;4.死亡状态(Dead)线程的终止一般可通过两种方法实现:自然撤消(线程执行完)或是被停止(调用stop()方法)。,12.2多线程的互斥与同步,前面所提到的线程都是独立的,而且异步执行,也就是说每个线程都包含了运行时所需要的数据或方法,而不需要外部的资源或方法,也不必关心其它线程的状态或行为。但是经常有一些同时运行的线程需要共享数据,此时就需考虑其他线程的状态和行为,否则就不能保证程序的运行结果的正确性。下面的示例说明了此问题。,临界资源问题,一个堆栈Stack类,publicclassStackintidx=0;/堆栈指针的初始值为0chardata=newchar6;/堆栈有6个字符的空间publicvoidpush(charc)/压栈操作dataidx=c;/数据入栈idx+;/指针向上移动一位publiccharpop()/出栈操作idx-;/指针向下移动一位returndataidx;/数据出栈,一个堆栈Stack类续,1)操作之前2)A执行push中的第一个语句,将r推入堆栈;,一个堆栈Stack类续,3)A还未执行idx+语句,A的执行被B中断,B执行pop方法,返回q:4A继续执行push的第二个语句:最后的结果相当于r没有入栈。产生这种问题的原因在于对共享数据访问的操作的不完整性。,互斥锁,为解决操作的不完整性问题,在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。关键字synchronized来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。,互斥锁续,互斥锁续,publicclassStackintidx=0;/堆栈指针的初始值为0chardata=newchar6;/堆栈有6个字符的空间publicvoidpush(charc)synchronized(this)/this表示Stack的当前对象dataidx=c;idx+;publiccharpop()synchronized(this)/this表示Stack的当前对象idx-;returndataidx;,互斥锁续,synchronized除了象上面讲的放在对象前面限制一段代码的执行外,还可以放在方法声明中,表示整个方法为同步方法。publicsynchronizedvoidpush(charc)如果synchronized用在类声明中,则表明该类中的所有方法都是synchronized的。,多线程的同步,我们把系统中使用某类资源的线程称为消费者,产生或释放同类资源的线程称为生产者。代码示例:请参见SyncTest.java,多线程的同步续,类Producer是生产者模型,其中的run()方法中定义了生产者线程所做的操作,循环调用push()方法,将生产的20个字母送入堆栈中,每次执行完push操作后,调用sleep()方法睡眠一段随机时间,以给其他线程执行的机会。类Consumer是消费者模型,循环调用pop()方法,从堆栈中取出一个数据,一共取20次,每次执行完pop操作后,调用sleep()方法睡眠一段随机时间,以给其他线程执行的机会。,下面比较一下wait()、notify()和notifyAll()方法:,(1)wait,nofity,notifyAll必须在已经持有锁的情况下执行,所以它们只能出现在synchronized
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合租房屋合同汇编15篇
- 2025年甘肃省临夏州临夏德雅高级中学春季教师招聘19人模拟试卷及答案详解(网校专用)
- 2025年杭州市上城区望江街道社区卫生服务中心招聘编外1人模拟试卷及答案详解(名校卷)
- 2025年福建农林大学教学科研人员招聘206人模拟试卷及一套参考答案详解
- 婚宴父亲答谢致辞(集合15篇)
- 2025年度湖北省纪委监委考试录用公务员专业测试模拟试卷及1套完整答案详解
- 2025年楚雄技师学院云南现代职业技术学院高层次人才和急需紧缺招聘考前自测高频考点模拟试题及答案详解(必刷)
- 2025年绿色建筑认证体系在绿色建筑绿色建筑行业规范中的应用与发展报告
- 2025年纺织服装制造业智能化生产中的数字孪生技术应用报告
- 2025年城市公共卫生设施建设项目环境风险评估报告
- 八年级语文写作技巧与课堂教案
- 鼻出血的课件护理
- 2025年干细胞治疗行业研究报告及未来行业发展趋势预测
- (2025年标准)清理乱账服务协议书
- 2025年五粮液笔试考试题及答案
- 2025年4月自考00155中级财务会计试题及答案含评分标准
- 道路工程培训课件
- DGTJ08-2004B-2020 建筑太阳能光伏发电应用技术标准
- 国庆假期大学生安全教育
- 呼吸内科出科汇报
- JJF 2267-2025场磨式大气电场仪校准规范
评论
0/150
提交评论