java基础课程14-第十四章多线程_第1页
java基础课程14-第十四章多线程_第2页
java基础课程14-第十四章多线程_第3页
java基础课程14-第十四章多线程_第4页
java基础课程14-第十四章多线程_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

Java基础课程第十四章简本课件由网新()软件 (以下简称:网新)编制,网新仿真实训的学网新享有本课件中的文字叙述、文档格式、插图、等所有信息资料的,受知识法及法等法律、的保护。任何个人或组织网新的 ,网新保留 上节课回 本课目线程的通讯(难点什么是线一个程序由一个或多个进程组成的,一个进程包含一个或多个线程进程(process)本质上是一个可执行的程序。操作系统引入进程概念象实例对应一个线程多线程则指的是在单个程序中可以同时运行多个不同的线什么是线 。 线程的调抢占式:高优先级的线程抢占classMythreadextendsThreadpublicstaticvoidmain(Stringargs[])Threadt=tryfor(inti=0;i<3;i++)

输出每个 暂停1500catch(InterruptedExceptione)}}ThreadThreadrunclassmythreadextendsThread{publicvoidrun**}Runnablerun。classmythreadimplementsRunnable{publicvoidrun(){/*实现该方法*/}}startMythreadt=newstartrun()Thread(Stringname)构造名称为name classMyThread1extendsThreadpublicstaticvoidmain(Stringargs[])Threadt=

或者使implementsMyThread1ex=new}publicvoidrun()}}Born)Ready)start(Running睡眠(Slee ):线程的执行可通过使用sleep()方法来Waiting)waitResume)以说它已被恢复。阻塞(Blocked)– ,线程就处 状态。现在也不使用stop()方法新线程(新建

线程生命周ThreadstateNe

sleep()timeouorthreadjoin()orinterupt(

OtherwiseBlockedorstart( sleep(orjoin(Runnabl

Schedule

Runnin

run()complete

DeaLocavailabl synchronized(Blockedinobject`swait()pool

notify(interupt()

Blockedinobject`slockpool新死死注意stop()方法已经被作

CPUsleep(waityieldCPUclassThreadStateDemoextendsThreadThreadpublicThreadStateDemo()t=newSystem.out.printlntSystem.out.printlnt.start();publicvoidrun()try{ System.out.printlntcatch(InterruptedExceptionIE)System.out.println");}publicstaticvoidmain(Stringargs[])newThreadStateDemo();线程类常用方currentThread()返回当前运行的Thread对象。start(run()线程体,由start()方法调用,当run()方法返sleep(intn)使线程睡眠n毫秒,n毫秒后,线程可线程类常用方resume()恢复挂起的线程,使其处于可运行状态yield()将CPU控制权主动移交到下一个可运行线setName()设置线程的名字。isAlive()如果线程已被启动并且未被终止,那么isAlive()返回true。如果返回false,则该线程是线程调让处于运行状态的线程调用Thread.sleep让处于运行状态的线程调用Thread.yield让处于运行状态的线程调用另一个线程的join()线程睡眠:Thread.sleep()方publicclassMyThreadextendsThread{publicvoidrun(){for(inttry{Thread.sleep(100);}catch(InterruptedExceptione){}}}publicstaticvoidmain(Stringargs[]){MyThreadt1=newMyThread();MyThreadt2=newMyThread();}}线程让步:Thead.yield()方publicclassMyThreadextendsThread{publicvoidrun(){for(intSystem.out.println(Thread.currentThread().getName()+"}}publicstaticvoidmain(Stringargs[]){MyThreadt1=newMyThread();MyThreadt2=newMyThread();}}等待其他线程结束publicclassMachineextendsThread{publicvoidrun(){for(inta=0;a<10;a++)}publicstaticvoidmain(Stringargs[])throwsException{Machinemachine=newMachine();();}}线程类 publicfinalvoidsetDaemon(booleanpublicfinalbooleanisDaemon线程(精灵线程可以用方法publicbooleanisDaemon()确定一个线程是否守护线程,也可以用方法publicvoidsetDaemon(boolean)来设定一个线程为守护线程。 JavaThreadNORM_PRIORITYMAX_PRIORITYMIN_PRIORITYfinalvoidsetPriority(intnewp)finalintgetPriority共享资源的竞当多个线程共些数据,它们的操作会竞争共享资源,这以一个生产者(Producer),消费者(Consumer)为例,生产

堆栈privateStringintpoint=-1;…publicStringpop()Stringgoods=buffer[point];

push()

}publicvoidpush(Stringgoods){}生产者线classProducerextendsThread{privateStacktheStack;privateStringbuffer[3]buffer[2]buffer1]publicbuffer[3]buffer[2]buffer1]theStack=;

}publicvoidrun(){Stringgoods;for(inti=0;i<200;i++)System.out.println(name+":push"+goods+"to}}消费者线classConsumerextendsThreadprivateStringname;publicConsumer(Stacks,Stringname){=name;buffer[3]buffer[2]buffer[3]buffer[2]buffer1];

消费者线

}publicvoidrun(){Stringgoods;for(inti=0;i<200;i++){goods=theStack.pop();+":pop"+goods+"from"+theStack.getName());}}}创建生产者和消费者线publicclassTestpublicstaticvoidmain(Stringargs[]){Stackstack=newStack("stack1");Producerproducer1=newProducer(stack,"producer1");Consumerconsumer1=newConsumer(stack,"consumer1");}}生产 消费堆堆共享资源的竞打打印结果producer1:pushgoods0tostack1consumer1:popnullfromstack1producer1:pushgoods0tostack1…线程的同同步是一种保证共享资源完整性publicStringpop(){Stringgoods=return

publicsynchronizedStringpop(){Stringgoods=buffer[point];}}} 堆栈的方法同classStack…publicsynchronizedintgetPoint(){returnpoint;}publicsynchronizedStringpop(){…}publicsynchronizedvoidpush(Stringgoods)}线程同修改完代码以线程同在Product类的runstack线程 机制,在Java5之前,我们只能使用synchronized来锁定。们使用ReentrantLock保证代码线程安全privatestaticReentrantLocklock=new//执行后释放 堆栈的方法同 堆栈的方法同线程同步的特线程的同步的特publicstaticvoidmain(Stringargs[])Stackstack1=newProducerproducer1=newProducer(stack1,"producer1");Producerproducer2=newProducer(stack1,"producer2");Producerproducer3=newProducer(stack1,"producer3");Consumerconsumer1=newConsumer(stack1,"consumer1");Stackstack2=newStack("stack2");Producerproducer4=newProducer(stack2,"producer4");Consumerconsumer2=newConsumer(stack2,"consumer2");}}线程的同步的特

Stack1

wait()、notify()和notifyAll()方法。Objectfinal调用notify()方法。notify(waitnotifyAll(wait调用的线程放弃线程通 S生产者与消费者线程通classStack…publicsynchronizedStringpop(){}Stringgoods=buffer[point];point--return}publicsynchronizedvoidpush(Stringgoods){}生产者与消费者线程通classStack…publicsynchronizedvoidpush(Stringgoods){}}}生产者与消费者线程通publicclassTestpublicstaticvoidmain(Stringargs[]){Stackstack1=newStack("stack1");Producerproducer1=newProducer(stack1,"producer1");Consumerconsumer1=newConsumerconsumer2=new}}}生产者与消费者线程通–(1)执行this.notifyAll()方法,此时this的stack1(2)由于point为-1,因此执行this.wait()方法,生产者与消费者线程通 终止线 实际编程中,一般是定义一个标志变量,然后通过程序来改变标志变量的值,从而控制线run()方法中自然退出。终止线publicclassMyThreadStopextendsThread{inta;booleanflag=false;publicvoidrun(){}}publicvoidsetFlag(boolean_flag){}publicstaticvoidmain(Stringargs[]){try{Thread.sleep(1000);}catch(Exception}}死死classOperatorimplementsRunn

温馨提示

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

最新文档

评论

0/150

提交评论