oop10章多线程程序设计-new_第1页
oop10章多线程程序设计-new_第2页
oop10章多线程程序设计-new_第3页
oop10章多线程程序设计-new_第4页
oop10章多线程程序设计-new_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章多线程第10章多线程10.1多线程基本概念10.2创建线程的方式10.3线程的挂起与唤醒10.4多线程问题10.5小结210.1多线程基本概念文件输入输出装置各种系统资源数据区段程序区段只有一个地方在执行文件输入输出装置各种系统资源数据区段程序区段同时有数个地方在执行传统的进程多线程的任务310.1多线程基本概念多线程的优势:减轻编写交互频繁、涉及面多的程序的困难.程序的吞吐量会得到改善.(BT/多线程下载)在多个处理器的系统,可以并发运行不同的线程.(否则,任何时刻只有一个线程在运行)410.1多线程基本概念线程与进程的区别:进程之间:内部数据和状态都完全独立多线程:在同一进程内部,多线程共享一块内存空间和一组系统资源,有可能互相影响.线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。510.1多线程基本概念对线程的综合支持是Java技术的一个重要特色.它提供了thread类、管程和条件变量的技术.虽然Macintosh,WindowsNT,Windows9等操作系统支持多线程,但若要用C或C++编写多线程程序是十分困难的,因为它们对数据同步的支持不充分.610.1多线程基本概念newThread()NewThreadRunnablestart()NotRunnablestop()stop()Deadyield()stop()orrun()exit..suspend()sleep()wait()notify()notifyAll(0resume().线程的状态线程有四个状态:新生,运行,暂停,死亡710.2创建线程的方式1.继承类ThreadpublicclassMythreadextendsThread 产生线程的对象ThreadnewThread=newMyThread();2.publicclassThreadByRunableimplementsRunnable(实现Runnable接口) 产生线程的对象ThreadnewThread=newThread(newThreadByRunable());4.启动线程 newThread.start();810.2创建线程的方式5.run方法是运行线程的主体,启动线程时,由java直接调用publicvoidrun()6.停止线程,由小应用程序的stop调用线程的stopnewThread.stop()7sleep方法的作用,暂停线程的执行,让其它线程得到机会,sleep要抛出异常,必须捕捉.Try{sleep(100)}catch(InterruptedExceptione){}9例1:publicclassTestThreadextendsThread{publicTestThread(){}//空构造方法publicvoidrun(){System.out.println("run()方法运行....");}publicstaticvoidmain(Stringarg[]){ TestThreadt=newTestThread();System.out.println("start()开始运行...");t.start();}}10.2创建线程的方式1010.2创建线程的方式例2:带休息的线程publicclasstestThreadextendsThread{publictestThread(){}publicvoidrun(){for(inti=0;i<100;i++){System.out.println(i+":run()方法运行....");

try{sleep(1000);//休息一秒钟}catch(InterruptedExceptione){}}}publicstaticvoidmain(Stringarg[]){testThreadt=newtestThread();System.out.println("start()开始运行...");t.start();}}11例3,多个线程猜猜程序执行结果publicclassMultiThreadextendsThread{intthreadNo;//给线程一个编号标志publicMultiThread(intno){threadNo=no;}publicvoidrun(){for(inti=0;i<1000;i++){System.out.println("Thread:"+threadNo+""+i+":run()方法运行....");}}//endofrunpublicstaticvoidmain(Stringarg[]){MultiThreadmt1=newMultiThread(1);MultiThreadmt2=newMultiThread(2);System.out.println("start()开始运行...");mt1.start();mt2.start();}}1210.2创建线程的方式8.其它常用的方法isAlive:判断线程目前是否正在执行状态中if(newthread.isAlive())newthread.stop();resume:要求被暂停得线程继续执行suspend:暂停线程的执行interrupt:中断正在运行中的线程join:等待线程执行完毕thatThread.join();被等待的那个线程不结束,当前线程就一直等待.yield():避让,将执行的权力交给其它线程,自己到队列的最后等待.1310.2创建线程的方式9.线程的优先权某一时刻只有一个线程在执行,调度策略为固定优先级调度.线程可以给定自1-10的10个不同优点级,1最低,10最高设置方法:newthread.setPriority(Thread.MIN_PRIORITY)级别有:MIN-PRIORITYNOM_PRIORITYMAX-PRIORITY10.自私的线程:有很高的优先权的线程,不主动睡眠或让出处理器控制权.14例4,设定优先级后的多线程publicclassPrioritiedThreadextendsThread{intthreadNo;

publicPrioritiedThread(intno){threadNo=no;}publicvoidrun(){for(inti=0;i<1000;i++){System.out.println("Thread:"+threadNo+""+i+":run()方法");}}publicstaticvoidmain(Stringarg[]){PrioritiedThreadmt1=newPrioritiedThread(1);PrioritiedThreadmt2=newPrioritiedThread(2);System.out.println("start()开始运行...");mt1.setPriority(3);mt2.setPriority(8);mt1.start();mt2.start();}}15多线程同时运行的特点:多个进程运行时执行顺序是交叉的多个线程运行时,调度策略为固定优先级调度.级别相同时,由操作系统按时间片来分配较高的优先权的线程运行时间多,较低获得较少运行时间1610.3线程的结束方式当一个线程执行完所有语句后就自动终止,调用线程的stop()方法,也可以强制终止线程。如果希望线程正常终止,可采用标记来使线程中的run()方法退出。1710.3线程的结束方式publicclassXyzimplementsRunnable{privatebooleantimeToQuit=false;publicvoidrun(){while(!timeToQuit){…..}//cleanupbeforerun()ends;}publicvoidstopRunning(){timeToQuit=true;}}1810.3线程的结束方式publicclassControlThread{privateRunnabler=newXyz();privateThreadt=newThread(r);

publicvoidstartThread(){t.start();}

publivoidstopThread(){r.stopRunning();}}1910.4多线程问题---如何写多线程1.分别定义不同的线程类,在各自的run方法中定义线程的工作

classmythread1extendsThread{publicvoidrun{….}}classmythread2extendsThread{publicvoidrun{….}}2.在主类中实例化各线程类,并启动线程.publicclassdemoextendsApplet{publicvoidinit(){mythreadt1=newmythread1();mythreadt2=newmythread2();t1.start();t2.start();}}2010.4多线程问题---如何写多线程练习:将窗口分为上下两个区,分别运行两个线程,一个在上面的区域中显示由右向左游动的字符串,另一个在下面的区域从左向右游动的字符串.方法一:一个线程,在paint方法中使用两个输出字符串的语句publicvoidpaint(Graphicsg){ify1<0y1=200elsey1=y1-10;ify2>200y2=0elsey2=y2+10;g.drawString(“hello,Java!”,20,y1,);g.drawString(“hello,Java!”,40,y2,);}2110.4多线程问题---如何写多线程方法二:定义两个类,运行各自的线程,各自有自己的paint()方法.注意:两个小应用程序必须是panel类或者是canvas类,将小应用的区域分成两块,否则不能运行paint语句.2210.4多线程问题---线程间的通信1.线程间的通信可以用管道流,.创建管道流:PipedInputStreampis=newPipedInputStream();PipedOutputStreampos=newPipedOutputStream(pis);或:PipedOutputStreampos=newPipedOutputStream();PipedInputStreampis=newPipedInputStream(pos);线程1PipedOutputStreamPipedInputStream输出流outStream输入流inStream线程22310.4多线程问题---线程间的通信管道流不能直接读写PrintStreamp=newPrintStream(pos);p.println(“hello”);DataInputStreamd=newDataInputStream(pis);d.readLine();2.通过一个中间类来传递信息.线程2线程1中间类mssm.write(s)s=m.read()write()read()printStreamDataInputStream2410.4多线程问题--线程间的通信管道流可以连接两个线程间的通信下面的例子里有两个线程在运行,一个往外输出信息,一个读入信息.将一个写线程的输出通过管道流定义为读线程的输入.outStream=newPipedOutputStream();inStream=newPipedInputStream(outStream);newWriter(outStream).start();newReader(inStream).start();

2510.4多线程问题--线程间的通信主类Pipethread辅类Writer线程类辅类Reader线程类管道流将数据写到输出流从流中读数据输入流作为参数传给WriterWriter(outStream)2610.4多线程问题--线程间的通信.publicclassPipethread{

publicstaticvoidmain(Stringargs[]){PipethreadthisPipe=newPipethread();thisPcess();}publicvoidprocess(){PipedInputStreaminStream;PipedOutputStreamoutStream;PrintStreamprintOut;try{outStream=newPipedOutputStream(); inStream=newPipedInputStream(outStream);

newWriter(outStream).start();

newReader(inStream).start();

}catch(IOExceptione){}}}2710.4多线程问题---读管道线程classReaderextendsThread{privatePipedInputStreaminStream;//从中读数据

publicReader(PipedInputStreami){inStream=i;}publicvoidrun(){Stringline;DataInputStreamd;booleanreading=true;try{d=newDataInputStream(inStream); while(reading&&d!=null){ try{line=d.readLine(); if(line!=null){ System.out.println(”读:"+line);} elsereading=false; }catch(IOExceptione){}}catch(Exceptione){System.exit(0);} try{Thread.sleep(4000);} catch(InterruptedExceptione){}}}2810.4多线程问题—写数据线程.classWriterextendsThread{privatePipedOutputStreamoutStream;//将数据输出privateStringmessages[]={"Monday","Tuesday","Wednsday", "Thursday","Friday:","Saturday:","Sunday:"};publicWriter(PipedOutputStreamo)

{outStream=o;}publicvoidrun()

{PrintStreamp=newPrintStream(outStream);for(inti=0;i<messages.length;i++){

p.println(messages[i]);//向管道中写出数据 p.flush(); System.out.println(“写:"+messages[i]);} p.close();p=null;}}2910.5多线程问题---资源协调1.数据的完整性线程1线程2线程10资源取过来加1后送回去withdrwal()withdrwal()透支余额变量3010.5多线程问题---资源协调互斥锁(管程):对共享对象的访问必须同步,Java通过管程实现线程的同步.(英文名为Monitor有的参考书称其为监视器)互斥锁是一个对象,包含共享的数据,也包含阻止两个线程同时访问同一个数据的机制,象锁一样作用在数据上.Java为每个拥有synchronized方法的实例对象提供一个唯一的互斥锁(管程),互斥锁入口就是synchronized方法的入口,调用该方法就接受它的管理。图示:withdrawal1为一实现了管程的方法线程1进入withdrawal方法时,获得(加锁);当线程1的方法执行完毕返回时,开锁,线程2的withdrawal方能进入.withdrawal()线程1互斥锁线程23110.4多线程问题---资源协调用synchronized来标识的区域或方法即为管程监视的部分。一个类或一个对象有一个管程,如果一个程序内有两个方法使用synchronized标志,则他们在一个管程管理之下.一般情况下,只在方法的层次上使用关键区getput监视器线程1线程23210.4多线程问题---资源协调此处给出的例子演示两个线程在同步限制下工作的情况.classAccount{staticsintbalance=1000;//为什么用static?staticsintexpense=0;publicsynchronizedvoidwithdrawl(intamount){if(amount<=balance){balance-=amount;expense+=amount;}else{System.out.println(“bounced:“+amount);}}}3310.4多线程问题---资源协调2.等待同步数据生产者消费者..共享对象put()get()可能出现的问题:生产者比消费者快时,消费者会漏掉一些数据没有取到消费者比生产者快时,消费者取相同的数据.notify()和wait()方法用来协调读取的关系.notify()和wait()都只能从同步方法中的调用.3410.4多线程问题---资源协调notify()的作用是唤醒正在等待同一个管程的线程.wait()的作用是让当前线程等待信息版例子get()方法在读信息之前先等待,直到信息可读,读完后通知要写的线程.put()方法在写信息之前先等待,直到信息被取走,写完后通知要读的进程.3510.4多线程问题---资源协调ProducerConsumeraaaaPCQueue3610.4多线程问题---资源协调publicclassProducerConsumerDemo1{publicstaticvoidmain(String[]args){PCQueuec=newPCQueue();Producerp1=newProducer(c,1);Consumerc1=newConsumer(c,1);p1.start();c1.start();}}3710.3多线程问题---资源协调//定义一个队列classPCQueue{//一个实现管程的类privateintseq;privatebooleanavailable=false;//定义一个可用性标志publicsynchronizedintget(){while(available==false){try{wait();}catch(InterruptedExceptione){}}available=false;notifyAll();returnseq;}publicsynchronizedvoidput(intvalue){while(available==true){try{wait();}catch(InterruptedExceptione){}}available=true;seq=value;notifyAll();}}3810.3多线程问题

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论