版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章多线程机制1Java支持多线程技术在Java程序中,线程的最普遍的用途是允许Applet在接受用户输入的同时,在屏幕的另一处显示动画。我们现在编程已经离不开多线程技术。多线程技术可以编写出CPU最大利用率的高效程序,因为空闲时间保持最低,这对Java运行的网络互联环境是至关重要的。2本节内容1、多线程概念2、多线程程序设计方法3、线程的调度和同步31、多线程概念程序是为完成特定任务、用某种语言编写的一组指令的集合。指一段静态的代码。进程是程序的一次执行过程,是系统进行调度和资源分配的一个独立单位。
执行就绪等待PCBCPU挂起4程序-进程-线程线程是比进程更小一级的执行单元。一个进程在其执行过程中,可以产生多个线程,形成多条执行线索。每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。一个线程有它自己的入口和出口,以及一个顺序执行的序列线程不能独立存在,必须存在于进程中,各线程间共享进程空间的数据。线程—线程创建、销毁和切换的负荷远小于进程,又称为轻量级进程(lightweightprocess)。系统负担小,主要是CPU的分配。51、多线程概念多线程是指同时存在几个执行体,按几条不同的执行线索共同工作的情况。多线程实现单个进程中的并发计算。各线程间共享进程的内存空间和系统分配给该进程的资源,线程本身的数据通常只有微处理器的寄存器数据,以及一个可供程序执行时使用的堆栈。线程的切换比进程的切换系统负担要小的多。线程利用这些共享单元来实现数据交换、实时通信与必要的同步操作。多线程的程序能更好地表述和解决现实世界的具体问题,是计算机应用开发和程序设计的一个必然发展趋势。6进程与多线程单线程多线程进程传统进程多线程进程7Java与多线程Java语言的一个重要功能特点就是内置对多线程的支持,它使得编程人员可以很方便地开发出具有多线程功能,能同时处理多个任务的功能强大的应用程序。每个Java程序都有一个隐含的主线程applicationmain方法Applet小程序,主线程指挥浏览器加载并执行Java小程序。82、多线程程序设计方法线程控制(虚拟CPU)线程代码
线程的三个组成部分
被操作数据线程的组成9Java对多线程的支持提供对多线程的支持Thread类start(),stop(),run()Runnable接口实现多线程的两种编程方法继承Thread类实现Runnable接口10线程的调度调度策略时间片:抢占式:高优先级的线程抢占CPUJava的调度方法同优先级线程组成先进先出队列,使用时间片策略对高优先级,使用优先调度的抢占式策略1211线程的生命周期要想实现线程,必须在主线程中创建新的线程对象。Java语言使用Thread类及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的五种状态:新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态就绪:处于新建状态的线程被启动后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件运行:当就绪的线程被调度并获得处理器资源时,便进入运行状态,run()方法定义了线程的操作和功能阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU并临时中止自己的执行,进入阻塞状态死亡:线程完成了它的全部工作或线程被提前强制性地中止stop()或destroy()12线程的生命周期13线程的生命周期Newborn:线程已创建,但尚未执行Runnable:(就绪)线程已被调度,按优先级和先到先服务原则在队列中排队等待CPU时间片资源Runnnig:正在运行Blocked:(阻塞)因某事件或睡眠而被暂时性地挂起Dead:正常/强行中断,退出运行状态14线程状态新建状态newThread(..)就绪状态start()等待状态执行状态I/Osleep()CPU调度run()结束stop()yield()消亡
I/O完成sleep时间到15Thread类Thread类综合了Java程序中一个线程需要拥有的属性和方法当生成一个Thread类的对象后,一个新的线程诞生了。每个线程都是通过目标对象的方法run()来完成其操作的。方法run()称为线程体(线程方法)。提供线程体的目标对象是在初始化一个线程时指明的。任何实现了Runnable接口(实现run()方法)的类实例都可以作为线程的目标对象。16方法之一:继承Thread类Thread类中综合了Java程序中一个线程需要拥有的属性和方法。当生成一个Thread类对象后,一个新的线程就产生了。该线程可以启动、终止、挂起等操作。17方法之一:继承Thread类Thread类的重要方法:run()定义线程的具体操作系统调度此线程时自动执行初始时无具体操作内容如何编程呢?-继承Thread类,定义run()方法18Thread类java.lang包构造函数Thread();Thread(Runnabletarget);//该种构造函数在第二种创建线程的方法中用。Thread(Stringthreadname);指定线程实例名线程的优先级控制三个常量:MAX_PRIORITY10;MIN_PRIORITY1;NORM_PRIORITY5;getPriority()返回线程优先值setPriority(intnewPriority)改变线程的优先级线程创建时继承父线程的优先级19Thread类的有关方法voidstart():由Newborn到Runnable启动线程StringgetName():返回线程的名称run():线程在被调度时执行的操作staticvoidsleep(指定时间毫秒):令当前活动线程在指定时间段内放弃对CPU控制,使其他线程有机会被执行,时间到后重排队产生例外InterruptedException用try块调用sleep(),用catch块处理例外20Thread类的有关方法(续)suspend():挂起线程,处于阻塞状态resume():恢复挂起的线程,重新进入就绪队列排队应用:可控制某线程的暂停与继续方法:设一状态变量suspendStatus=false(初始)暂停:if(!suspendStatus) {T.suspend();suspendStatus=true;}继续:if(suspendStatus) {T.resume();suspendStatus=false;}21Thread类的有关方法(续)staticvoidyield():对正在执行的线程。若就绪队列中有与当前线程同优先级的排队线程,则当前线程让出CPU控制权,移到队尾若队列中没有同优先级的线程,忽略此方法stop():强制线程生命期结束。booleanisAlive():返回boolean,表明是否线程还存在。staticcurrentThread():返回当前线程。
22生成与运行线程–方法1MyThreadmt=newMyThread();mt.start();
classMyThreadextendsThread{publicvoidrun(){线程体…}}执行run()方法23Thread类方法总结启动线程:start()有关线程执行的控制:stop()、suspend()、resume()有关调度控制Thread.sleep(10);//低优先级的线程也可以获得执行Thread.yield();//同优先级的线程可以获得执行suspend();//暂停本线程24方法之二:RunnableRunnable接口自定义类实现Runnable接口,该接口中只有一个run方法。使用Thread类的另一构造函数:Thread(Runnable,String)用实现了Runnable接口的类的对象中所定义的run()方法,来覆盖新创建的线程对象的run()方法。使用start()启动线程25方法之二:Runnable(续)例:classAimplementsRunnable{ publicvoidrun(){….}}classB{ publicstaticvoidmain(String[]arg){ Runnablea=newA(); Threadt=newThread(a); t.start(); } }26建立线程例publicclassThreadTest{publicstaticvoidmain(String[]args){Job1j=newJob1();Threadt1=newThread(j);t1.start();}}classJob1implementsRunnable{inti=1;publicvoidrun(){while(i<50){System.out.println(i++);}}}27生成与运行线程–方法2
classMyRunimplementsRunnable{publicvoidrun(){线程体…}}
MyRunmr=newMyRun();Threadt1=newThread(mr);t1.start();//Thread实例用于线程控制适合于:定义run()方法的类必须是其他类或其他类的子类。28方法之二:Runnable(续)两种方法的选择当需要从其他类,如Applet类继承时,使用Runnable接口当编写简单的程序时,可考虑使用继承Thread类29构造线程体的两种方法的比较1、使用Runnable接口(1)可以将CPU,代码和数据分开,形成清晰的模型。(2)还可以从其他类继承。(3)保持程序风格的一致性。2、直接继承Thread类(1)不能从其他类继承(2)编写简单,可以直接操纵线程,不需使用Thread.currentThread()方法。30举例:课本P254例子本例中共有三个线程。main线程的优先级最高。如果把main线程的睡眠时间改为100ms,会发生什么结果?31classPriorityTimeimplementsRunnable{intcounter=0; privatebooleanflag=true; Threadt; publicPriorityTime(intp) {t=newThread(this); t.setPriority(p);} publicvoidrun() {System.out.println("线程开始了,马上进入循环"); while(flag) {counter++;} System.out.println(t.getName()+"结束了,再见!"); System.out.println("\n"); } publicvoidstopthread() {flag=false;} publicvoidstart() {t.start();}}32classCreateTwoThread{publicstaticvoidmain(Stringargs[]) { Thread.currentThread().setPriority(Thread.MAX_PRIORITY); PriorityTimehigher=newPriorityTime(Thread.NORM_PRIORITY+2); PriorityTimelower=newPriorityTime(Thread.NORM_PRIORITY-2); lower.start(); higher.start(); try{ Thread.sleep(7000); }catch(InterruptedExceptione) {System.out.println("Mainthreadinterrupted.");} lower.stopthread(); higher.stopthread(); try{ higher.t.join(); //waitthethreadofhighertoend,whileforbiddingtheotherthreadtointerrupte lower.t.join(); }catch(InterruptedExceptione) {System.out.println("InterruptedExceptioncaught"); }
System.out.println("Low-prioritythread:"+lower.counter); System.out.println("higher-prioritythread:"+higher.counter); System.out.println("thethreadofMainisend."); }}337000ms运行界面:100ms运行界面:34线程的同步问题的提出多个线程执行的不确定性引起执行结果的不稳定如线程A:A1-A2 线程B:B1-B2多个线程对内存、数据的共享,会造成操作的不完整性,会破坏数据。如push(a):i++;num[i]=a;pop():取出num[i];i--;35线程的同步问题的解决同步:用synchronized关键字前缀给针对共享资源的操作加锁;同步方法、同步块
synchronizedvoidpush();synchronizedintpop();临界区synchronized语句和synchronized方法。实现机制:管程36课本实例:例10-7synchronized语句举例例10-7synchronized方法举例生产者消费者问题37线程的同步对象互斥锁在Java中,每个对象有一个“互斥锁”,该锁可用来保证在同一时刻只能有一个线程访问该对象。锁的使用过程(当一个线程要操作一个对象时)准备加锁对象是否已加锁加锁进入临界区执行操作解锁否是38线程的同步加锁1(临界区-方法)synchronized方法名{…}进入该方法时加锁加锁2(临界区-代码块)方法名{
….synchronized(this){…}//进入该代码段时加锁
….}一个线程为某对象加锁后,便对该对象具有了监控权。39线程的同步线程间需协调与通讯:生产者/消费者问题进队出队生产者消费者40线程的同步wait()与notify()Object类的方法:publicfinalvoidwait():令当前线程挂起并放弃管程,同步资源解锁,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问notify()唤醒正在排队等待资源管程的线程中优先级最高者,使之执行并拥有资源的管程wait()+notify()+标志变量:可协调、同步不同线程的工作41线程的同步主线程线程1()线程2()操作对象共享数据(队)synchronized同步方法1(生产)wait()notify()synchronized同步方法2(消费)wait()notify()42线程的同步
publicfinalvoidwait()
方法在当前线程中调用方法:对象名.wait()使当前线程进入等待(某对象)状态,直到另一线程对该对象发出notify(或notifyAll)为止。调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁)当前线程将释放对象监控权,然后进入等待队列(wait队列)。在当前线程被notify后,要重新获得监控权,然后从断点处继续代码的执行。43线程的同步
publicfinalvoidnotify()方法在当前线程中调用方法:对象名.notify()功能:唤醒等待该对象监控权的一个线程。调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁)notifyAll()唤醒wait队列中的所有线程,并把它门移入锁申请队列。44线程的同步Wait_Notify程序CubbyHole.java创建用户的线程子类Producer:产生数据(存数据);Consumer:消费数据(取数据)CubbyHole类,共享数据区,同步方法put(intvalue)方法intget()方法主类中创建共享数据对象,并启动两线程45classCubbyHole{privateintseq;//共享数据privatebooleanavailable=false;//条件标志变量public
synchronizedintget(){//取数据的同步方法get() while(available==false){ try{ wait();//条件不符合,则wait }catch(InterruptedExceptione){} } available=false;//修改条件 notify();//通知唤醒其他等待管程的线程 returnseq;//返回要取出的数值}//endofget()46//存放数据的同步方法put()publicsynchronizedvoidput(intvalue){ while(available==true){ try{ wait();//条件不符合,则wait }catch(InterruptedExceptione){} } seq=value;//把共享变量修改为要放置的数据 available=true;//修改条件 notify();//通知唤醒其他等待管程的线程}//endofput()}//endofclassCubbyHole47classProducerextendsThread{//生产者线程类privateCubbyHolecubbyhole;privateintnumber;publicProducer(CubbyHolec,intnumber){cubbyhole=c;this.number=number;}publicvoidrun(){//定义run()方法for(inti=0;i<10;i++){//共产生10个cubbyhole.put(i);
System.out.println("Producer#"+this.number+"put:"+i);try{sleep((int)(Mat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制造业务员工作总结
- 酒店管理岗位考核
- 美容行业前台接待工作总结
- 教师团队专业培训
- 厨具行业采购工作总结
- 2024年设备监理师考试题库带答案
- 2024年热的传递教案设计
- 创意市集活动赞助合同(2篇)
- DB33T 2111-2018 福利彩票视频型彩票销售管理规范
- 安徽省阜阳市阜南县2025届中考三模生物试题含解析
- 广东省广州市花都区2024年七年级上学期期末数学试题【附答案】
- 期末测试模拟练习 (含答案) 江苏省苏州市2024-2025学年统编版语文七年级上册
- 上海市徐汇区2024-2025学年高一语文下学期期末试题含解析
- 安全风险隐患举报奖励制度
- 江苏省苏州市2023-2024学年高三上学期期末考试 数学 含答案
- 线性代数知到智慧树章节测试课后答案2024年秋贵州理工学院
- 建筑幕墙工程检测知识考试题库500题(含答案)
- 安防主管岗位招聘面试题及回答建议(某大型集团公司)2025年
- 消防疏散演练宣传
- 2023-2024学年广东省广州市越秀区九年级(上)期末语文试卷
- 五年级数学下册 课前预习单(人教版)
评论
0/150
提交评论