已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十四章,多线程,14-1Java的多线程机制,多线程机制是Java语言的又一重要特征,使用多线程技术可以使系统同时运行多个执行体,这样可以加快程序的响应时间,提高计算机资源的利用率。使用多线程技术可以提高整个应用系统的性能。,14-1-1线程的生命周期,每个Java程序都有一个主线程,即main()方法对应的线程。要实现多线程,必须在主线程中创建新的线程。在Java语言中,线程用Thread类及其子类的对象来表示。每个线程要经历由“新生就绪运行阻塞死亡”5种状态,线程从新生到死亡的状态变化过程称为生命周期。,线程的生命周期,新生,就绪,阻塞,运行,死亡,1新生状态,用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态。,2就绪状态,处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,因而将进入线程队列,等待系统为其分配CPU。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。,3运行状态,在运行状态的线程执行自己的run方法中代码,直到调用其他方法而终止、或等待某资源而阻塞或完成任务而死亡。,4阻塞状态,处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时终止自己的运行,进入阻塞状态。在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待CPU资源。当再次获得CPU时,便从原来终止位置开始继续运行。,5死亡状态,死亡状态是线程生命周期中的最后一个阶段。线程死亡的原因有两个。一个是正常运行的线程完成了它的全部工作;另一个是线程被强制性地终止,如通过执行stop或destroy方法来终止一个线程。,14-1-2多线程的实现方法,在Java中,创建线程的方法有两种:通过创建Thread类的子类来实现;通过实现Runnable接口的类来实现。,14-2通过Thread类实现多线程,通过继承Thread类实现多线程的方法是首先设计Thread的子类,然后根据工作需要重新设计线程的run方法,再使用start方法启动线程,将执行权转交到run。,Java实例通过Thread类,/通过继承Thread类实现多线程classThread1extendsThreadStrings;intm,count=0;Thread1(Stringss,intmm)s=ss;m=mm;publicvoidrun()trywhile(true)System.out.print(s);sleep(m);count+;,Java实例(续),if(count=20)break;System.out.println(s+finished!);catch(InterruptedExceptione)return;publicstaticvoidmain(Stringargs)Thread1threadA=newThread1(A,50);Thread1threadB=newThread1(B,100);threadA.start();threadB.start();,运行该程序的输出结果如下所示:ABABAABAABAABAABAABAABAABAABAABAfinished!BBBBBBBBBBfinished!,14-3通过Runnable接口实现多线程,通过Runnable接口实现多线程的方法:设计一个实现Runnable接口的类,然后根据工作需要重新设计线程的run方法;建立该类的对象,以此对象为参数建立Thread类的对象;调用Thread类对象的start方法启动线程,将执行权转交到run方法。,Java实例通过Runnable接口,/通过Runnable接口实现多线程classThread2implementsRunnableStrings;intm,count=0;Thread2(Stringss,intmm)s=ss;m=mm;publicvoidrun()trywhile(true)System.out.print(s);Thread.sleep(m);if(+count=20)break;,Java实例(续),System.out.println(s+hasfinished!);catch(InterruptedExceptione)return;publicstaticvoidmain(Stringargs)Thread2threadA=newThread2(A,50);Thread2threadB=newThread2(B,100);ThreadthreadC=newThread(threadA);ThreadthreadD=newThread(threadB);threadC.start();threadD.start();,运行该程序的输出结果如下所示:ABABAABAABAABAABAABAABAABAABAABAhasfinished!BBBBBBBBBBhasfinished!,14-4线程等待,Java程序中的线程并发运行,共同争抢CPU资源。哪个线程抢夺到CPU资源后,就开始运行。线程的调度执行是按照其优先级高低的顺序进行的,为了防止高级线程未完成,低级线程没有机会获得CPU,使低级线程有机会执行,那么让高级线程暂时休眠一段时间,使用sleep()方法,休眠时间的长短由sleep()方法中的参数决定。,Java实例线程等待,例:各线程的并发执行classThread3extendsThreadStrings;intm,i=0;Thread3(Stringss)s=ss;publicvoidrun()tryfor(i=0;i6;i+)sleep(int)(500*Math.random();System.out.println(s);,Java实例(续),System.out.println(s+finished!);catch(InterruptedExceptione)return;publicstaticvoidmain(Stringargs)Thread3threadA=newThread3(A);Thread3threadB=newThread3(B);threadA.start();threadB.start();System.out.println(mainisfinished);,mainisfinishedBAABABABBABBfinished!AAfinished!,例:join()方法的功能classThread4extendsThreadStrings;intm,i=0;Thread4(Stringss)s=ss;publicvoidrun()tryfor(i=0;i6;i+)sleep(int)(500*Math.random();System.out.println(s);System.out.println(s+finished!);catch(InterruptedExceptione)return;,publicstaticvoidmain(Stringargs)Thread4threadA=newThread4(A);Thread4threadB=newThread4(B);threadA.start();trythreadA.join();catch(InterruptedExceptione)threadB.start();System.out.println(mainisfinished);,运行该程序的输出结果如下所示:AAAAAAAfinished!mainisfinishedBBBBBBBfinished!,14-5线程同步,Java提供了多线程机制,通过多线程的并发运行可以提高系统资源利用率,改善系统性能。但在有些情况下,一个线程必须和其他线程合作才能共同完成任务。线程可以共享内存,利用这个特点可以在线程之间传递信息。在Java中,实现同步操作的方法是在共享内存变量的方法前加synchronized修饰符。在程序运行过程中,如果某一线程调用经synchronized修饰的方法,在该线程结束此方法的运行之前,其他所有线程都不能运行该方法,只有等该线程完成此方法的运行后,其他线程才能y运行该方法。,例:线程并发引起的不确定性classCbankprivatestaticints=2000;publicstaticvoidsub(intm)inttemp=s;temp=temp-m;tryThread.sleep(int)(1000*Math.random();catch(InterruptedExceptione)s=temp;System.out.println(s=+s);,classCustomerextendsThreadpublicvoidrun()for(inti=1;i=4;i+)Cbank.sub(100);publicclassThread5publicstaticvoidmain(Stringargs)Customercustomer1=newCustomer();Customercustomer2=newCustomer();customer1.start();customer2.start();,其中一次运行的显示结果:s=1900s=1800s=1900s=1700s=1800s=1700s=1600s=1600,Java实例线程同步,例:线程的同步classCbankprivatestaticints=2000;publicsynchronizedstaticvoidsub(intm)inttemp=s;temp=temp-m;tryThread.sleep(int)(1000*Math.random();catch(InterruptedExceptione)s=temp;System.out.println(s=+s);,Java实例(续),classCustomerextendsThreadpublicvoidrun()for(inti=1;i=4;i+)C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 绿色启蒙教育
- 教学反思与前瞻
- 会计谈判礼仪宝典
- 环保行动我行我素
- 环保行动从我做起
- 职业危害防治措施及管理制度
- 2025年认证基础CCAA考试复习题库(答案+解析)
- 打造绿色家居
- 驾照三力考试题库及答案2025
- 2025年起重机械管理a5考试题及答案
- 模块一 银河麒麟桌面操作系统
- 仿真绿植合同模板
- 赠与协议书模板(2篇)
- 煤矿安全风险分级管控与隐患排查治理双重预防机制建设指南
- 浙江省温州市2023-2024学年七年级上学期语文期中考试试卷(含答案)
- 第1章机械运动章末提升核心素养课件人教版(2024)物理八年级上册
- 邮件分拣业务外包管理服务方案
- DB3501-T 011-2022供水智能监控系统建设技术要求
- DL∕T 5853-2022 火力发电厂烟囱工程施工与验收规范
- 绿色建筑评价标准 DG-TJ08-2090-2020
- SYT5405-2019酸化用缓蚀剂性能试验方法及评价指标
评论
0/150
提交评论