




免费预览已结束,剩余36页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第11章线程,11.1线程基本概念11.2线程的使用11.3同步与共享11.4线程间的通信11.5线程的挂起与唤醒11.6多线程问题11.7小结,2,11.1线程的概念,进程、线程示意图,3,11.1线程基本概念,文件,输入输出装置,各种系统资源,数据区段,程序区段,只有一个地方在执行,文件,输入输出装置,各种系统资源,程序区段,同时有数个地方在执行,传统的进程,多线程的任务,4,11.1线程基本概念,多线程的优势:1)减轻编写交互频繁、涉及面多的程序的困难.2)程序的吞吐量会得到改善.3)有多个处理器的系统,可以并发运行不同的线程.(否则,任何时刻只有一个线程在运行),5,11.1线程基本概念,线程与进程的区别:1)多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响.2)线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。,6,11.1线程基本概念,对线程的综合支持是Java技术的一个重要特色.java内在支持多线程,它的所有类都是在多线程的思想下定义的。Java中的线程可以认为由三部分组成:虚拟CPU,代码和数据。1)虚拟CPU封装在java.lang.Thread类中。2)虚拟CPU执行的代码,传递给Thread的类3)虚拟CPU处理的数据,传递给Thread的类虽然Macintosh,WindowsNT,Windows9等操作系统支持多线程,但若要用C或C+编写多线程程序是十分困难的,因为它们对数据同步的支持不充分.,7,11.2线程的使用,11.2.1线程体线程的所有活动都是通过线程的run()方法实现的,一个线程建立并初始化以后,运行时就自动调用run()方法。线程执行的起点从run()方法开始,就像应用程序从main()方法一样。run方法是运行线程的主体,启动线程时,由java直接调用publicvoidrun(),8,11.2线程的使用,11.2.2线程体的构造1.直接继承线程类ThreadpublicclassmythreadextendsThread方法中用类Thread产生线程的对象Threadnewthread;2,通过接口构造线程体通过建立一个实现Runnable接口的对象,并以它作为目标对象构造线程体。,9,11.2线程的使用,11.2.3线程的状态在线程的各生命周期中,它总出于某种状态中,线程的状态表示了线程正在进行的活动以及在这段时间内线程能完成的任务1)创建状态,当一个线程处于创建状态时,它仅仅是一个空的线程对象,系统不为它分配资源。2)可运行状态,线程处于该状态时,系统为这个线程分配了所需资源。3)运行中状态,当处于此状态时,系统为这个线程分配了所需资源,该线程占有CPU。4)不可运行状态,也称为阻塞状态,由于某种原因,系统不能执行线程的状态。5)死亡状态,线程执行结束,可以是自然撤销或被停止。自然撤销是从线程中正常退出,被停止是应用程序停止运行。当一个线程执行完所有语句后就自动终止,调用线程的stop()方法,也可以强制终止线程。,10,11.2线程的使用,11.2.3线程的状态,11,11.2.3线程的状态,线程状态及状态转换示意图,12,11.2线程的使用,11.2.4线程的调度线程的优先权某一时刻只有一个线程在执行,调度策略为固定优先级调度.newthread.setPriority(Thread.MIN_PRIORITY)级别有:MIN-PRIORITYNORM_PRIORITYMAX-PRIORITY自私的线程:有很高的优先权的线程,不主动睡眠或让出处理器控制权.,13,11.2线程的使用,11.2.5线程的控制1创建并启动线程newthread=newThread(this);newthread.start();/启动线程2不可运行状态停止线程,由小应用程序的stop调用线程的stopnewthread.stop()调用了sleep方法的作用,暂停线程的执行,让其它线程得到机会,sleep要丢出异常,必须抓住.Trysleep(100)catch(InterruptedExceptione)为了等一个条件变量,线程调用了wait()方法,如果要停止等待,需要调用notify()ornotifyall()方法。输入输出流中发生了线程阻塞3停止线程线程停止后即为死亡,分为自然撤销和被停止,14,11.2线程的使用,11.2.6线程调度的方法sleep():当前线程睡眠若干毫秒,由运行状态进入不可运行状态,睡眠过后再进入可运行状态。yield():引起当前线程暂停执行,以允许其他线程执行。线程处于可运行状态。isAlive():判断线程目前是否正在执行状态中if(newthread.isAlive()newthread.stop();resume():要求被暂停的线程继续执行suspend():暂停线程的执行join():等待调用该方法线程执行完毕thatThread.join();被等待的那个线程不结束,当前线程就一直等待.yield:将执行的权力交给其它线程,自己到队列的最后等待.Wait():用于实现线程间通信的同步控制方法。具体见教材264页。,15,11.2线程的使用,11.2.7有关线程的其他概念什么是daemon(守护)?在客户/服务器模式下,服务器的作用是等待用户发来请求,并按请求完成客户的工作守护线程是为其它线程提供服务的线程守护线程一般应该是一个独立的线程,它的run()方法是一个无限循环.守护线程与其它线程的区别是,如果守护线程是唯一运行着的线程,程序会自动退出,16,11.2线程的使用,11.2.7有关线程的其他概念,客户端,服务器端,request,daemon,17,11.3同步与共享,1.数据的完整性,18,11.3同步与共享,对共享对象的访问必须同步,保证任何时刻只能有一个线程访问该对象.Java语言允许通过监视器(MonitorModel)模型实现线程同步.监视器阻止两个线程同时访问同一个对象,它的如同锁一样作用在数据上.线程1进入withdrawal方法时,获得监视器(加锁);当线程1的方法执行完毕返回时,释放监视器(开锁),线程2的withdrawal方能进入.,19,11.3同步与共享,用synchronized来标识的区域或方法即为监视器监视的部分。一个类或一个对象有一个监视器,如果一个程序内有两个方法使用synchronized标志,则他们在一个监视器管理之下.,20,11.3同步与共享,例子:两个线程在同步限制下工作的情况.classAccountstaticsintbalance=1000;staticsintexpense=0;publicsynchronizedvoidwithdrawl(intamount)if(amount=balance)balance-=amount;expense+=amount;elseSystem.out.println(“bounced:“+amount);,21,11.3同步与共享,2.等待同步数据,可能出现的问题:生产者比消费者快时,消费者会漏掉一些数据没有取到消费者比生产者快时,消费者取相同的数据.notify()和wait()方法用来协调读取的关系.notify()和wait()都只能从同步方法中的调用.,22,11.3同步与共享,Notify()的作用是唤醒正在等待同一个监视器的线程.wait的作用是让当前线程等待read()方法在读信息之前先等待,直到信息可读,读完后通知要写的线程.write()方法在写信息之前先等待,直到信息被取走,写完后通知要读的进程.例,DemoWait.class,23,11.3同步与共享,classWaitNotifyDemopublicstaticvoidmain(Stringargs)MessageBoardm=newMessageBoard();Readerreadfrom_m=newReader(m);Writerwriteto_m=newWriter(m);readfrom_m.start();writeto_m.start();,24,11.3同步与共享,classMessageBoardprivateStringmessage;privatebooleanready=false;/(信号灯)publicsynchronizedStringread()while(ready=false)trywait();catch(InterruptedExceptione)ready=false;notify();/起始状态先写后读returnmessage;publicsynchronizedvoidwrite(Strings)while(ready=true)trywait();catch(InterruptedExceptione)message=s;ready=true;notify();,25,11.3同步与共享,classReaderextendsThreadprivateMessageBoardmBoard;publicReader(MessageBoardm)mBoard=m;publicvoidrun()Strings=;booleanreading=true;while(reading)s=mBoard.read();System.out.println(Readerread:+s);if(s.equals(logoff)reading=false;System.out.println(Finished:10seconds.);trysleep(10000);catch(InterruptedExceptione),26,11.3同步与共享,classWriterextendsThreadprivateMessageBoardmBoard;privateStringmessages=Monday:-,“.”,Sunday:-;publicWriter(MessageBoardm)mBoard=m;publicvoidrun()for(inti=0;imessages.length;i+)mBoard.write(messagesi);System.out.println(Writerwrote:+messagesi);trysleep(int)(Math.random()*100);catch(InterruptedExceptione)mBoard.write(logoff);,27,11.3同步与共享,3.死锁问题如果你持有一个锁并试图获取另一个锁时,就有死锁的危险.解决死锁问题的方法:给条件变量施加排序,28,11.4-线程间的通信,1.线程间的通信可以用管道流,.创建管道流:PipedInputStreampis=newPipedInputStream();PipedOutputStreampos=newPipedOutputStream(pis);或:PipedOutputStreampos=newPipedOutputStream();PipedInputStreampis=newPipedInputStream(pos);,29,11.4-线程间的通信,管道流不能直接读写PrintStreamp=newPrintStream(pos);p.println(“hello”);DataInputStreamd=newDataInputStream(pis);d.readLine();2.通过一个中间类来传递信息.,30,11.4-线程间的通信,管道流可以连接两个线程间的通信下面的例子里有两个线程在运行,一个往外输出信息,一个读入信息.将一个写线程的输出通过管道流定义为读线程的输入.outStream=newPipedOutputStream();inStream=newPipedInputStream(outStream);newWriter(outStream).start();newReader(inStream).start();,31,(threadPipethread.class),11.4-线程间的通信,主类Pipethread,辅类Writer线程类,辅类Reader线程类,管道流,将数据写到输出流,从流中读数据,输入流,作为参数传给WriterWriter(outStream),32,11.4-线程间的通信,publicclassPipethreadpublicstaticvoidmain(Stringargs)PipethreadthisPipe=newPipethread();thisPcess();publicvoidprocess()PipedInputStreaminStream;PipedOutputStreamoutStream;PrintStreamprintOut;tryoutStream=newPipedOutputStream();inStream=newPipedInputStream(outStream);newWriter(outStream).start();newReader(inStream).start();catch(IOExceptione),33,11.4-线程间的通信,classReaderextendsThreadprivatePipedInputStreaminStream;/从中读数据publicReader(PipedInputStreami)inStream=i;publicvoidrun()Stringline;DataInputStreamd;booleanreading=true;tryd=newDataInputStream(inStream);while(readingcatch(InterruptedExceptione),34,11.4-线程间的通信,classWriterextendsThreadprivatePipedOutputStreamoutStream;/将数据输出privateStringmessages=Monday,Tuesday,Wednsday,Thursday,Friday:,Saturday:,Sunday:;publicWriter(PipedOutputStreamo)outStream=o;publicvoidrun()PrintStreamp=newPrintStream(outStream);for(inti=0;imessages.length;i+)p.println(messagesi);p.flush();System.out.println(WrIte:+messagesi);p.close();p=null;,35,11.5线程的挂起与唤醒,暂停线程的执行等待条件满足再执行.例如:小应用程序第一次开始时,线程被启动浏览器改变页面时,小应用程序的stop()方法被调用,线程被挂起.浏览器回到原来的页面时,线程被唤醒.下面的例子显示线程的挂起和唤醒,36,11.5线程的挂起与唤醒,publicvoidstart()if(mythread=null)mythread=newThread();mythread.start();elsemythread.resume();publicvoidrun()while(true)trysleep(100);catch(InterruptedExceptione)publicvoidstop()mythread.suspend();.,37,11.6多线程问题-执行的顺序,多个线程运行时,调度策略为固定优先级调度。级别相同时,由操作系统按时间片来分配。下面给出的例子中,共运行三个线程,它们做同样的事,每次打印循环次数和自己的序列号,运行结果表明,它们并不是连续运行的.在上例中如果给某个线程赋予较高的优先权,则发现这个进程垄断控制权thread.setPriority(Thread.MAX_PRIORITY),38,11.6多线程问题-执行的顺序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纳米材料表征工作站企业制定与实施新质生产力项目商业计划书
- 施工阶段工程变更索赔管理措施研究
- 第15课《梅岭三章》说课稿2024-2025学年统编版语文七年级上册
- 登革热防控方案2025 年版测试题及参考答案
- DB62-T 4720.2-2023 农田耕层建设规范 第2部分:耕层构建
- 2025年全国安全生产月活动《安全知识》答题活动考前必考题附含答案
- 2025年陪诊考试题及答案
- 汽机辅机检修工岗前风险识别考核试卷含答案
- 2.机器人教学设计-2025-2026学年小学美术三年级上册人美版(常锐伦、欧京海)
- “双碳”背景下聚乳酸项目的综合效益评价研究
- 招聘渠道分析评估表
- 2025年注册安全工程师考试 安全生产法律法规与标准冲刺押题卷
- 服装色彩构成课件
- 化工仪表检修与维护课件
- 2025年华为软件开发工程师招聘面试题库及答案解析
- 程序化广告课件
- 电工基础课件
- 真菌生物膜毒力因子-洞察及研究
- 副校长在任职宣布会上的表态发言材料
- 同学互助基金管理办法
- 2025年建设工程质量检测行业现状分析及未来五年运行态势
评论
0/150
提交评论