Java 的多线程机制

上传人:伴*** 文档编号:243098191 上传时间:2024-09-15 格式:PPT 页数:60 大小:354KB
返回 下载 相关 举报
Java 的多线程机制_第1页
第1页 / 共60页
Java 的多线程机制_第2页
第2页 / 共60页
Java 的多线程机制_第3页
第3页 / 共60页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Java的多线程机制,*,6,Java,的多线程机制,主要内容,线程的概念,线程的生命周期,Java,中多线程的编程,继承,Thread,类与使用,Runnable,接口,Thread,类的主要方法,线程的同步与死锁,动画,2,Java的多线程机制,程序 - 进程 - 线程,程序是为完成特定任务、用某种语言编写的,一组指令的集合。指一段静态的代码。,进程是程序的一次执行过程,是系统进行调,度和资源分配的一个独立单位。,执行,就绪,等待,PCB,CPU,挂起,3,Java的多线程机制,程序-进程-线程,线程是比进程更小一级的执行单元。,一个进程在其执行过程中,可以产生多个线程,形,成多条执行线索。,每个线程也有它自身的产生、存在和消亡的过程,,也是一个动态的概念。,一个线程有它自己的入口和出口,以及一个顺序执,行的序列,线程不能独立存在,必须存在于进程中,各线程间,共享进程空间的数据。,线程 线程创建、销毁和切换的负荷远小于进程,,又称为轻量级进程(,lightweight process,)。,系统负担小,主要是,CPU,的分配。,4,Java的多线程机制,基本概念之一:进程,进程是正在运行的一个程序,程序:静态对象进程:动态过程,操作系统为每个进程分配一段内存空间,,包括:代码、数据以及堆栈等资源,多任务的操作系统(,OS,),中,进程切换对,CPU,资源消耗较大,5,Java的多线程机制,基本概念之二:多线程,多线程是指同时存在几个执行体,按几条不,同的执行线索共同工作的情况。,多线程实现单个进程中的并发计算。,各线程间共享进程空间的数据,并利用这些,共享单元来实现数据交换、实时通信与必要,的同步操作。,多线程的程序能更好地表述和解决现实世界,的具体问题,是计算机应用开发和程序设计,的一个必然发展趋势。,6,Java的多线程机制,进程与多线程,单线程,多线程,进程,传统进程,多线程进程,7,Java的多线程机制,线程的调度,调度策略,时间片,抢占式:高优先级的线程抢占,CPU,Java,的调度方法,同优先级,线程组成先进先出队列,使用,时间片策略,对高优先级,使用,优先调度的抢占式,策略,1,2,8,Java的多线程机制,Java,与多线程,Java,语言的一个重要功能特点就是内置对多,线程的支持,它使得编程人员可以很方便地,开发出具有多线程功能,能,同时处理多个任,务,的功能强大的应用程序。,每个,Java,程序都有一个隐含的主线程,application main,方法,Applet,小程序,主线程指挥浏览器加载并执,行,Java,小程序。,9,Java的多线程机制,线程的概念模型,线程控制,(虚拟,CPU),线程代码,线程的三个组成部分,被操作数据,10,Java的多线程机制,线程的生命周期,要想实现线程,必须在,主线程中创建新的线程对象,。,Java,语言使用,T,hread,类及其子类的对象,来表示线程,在它的一个完整的生命周期中通常要经历如下的五种状态:,新建: 当,一个Thread类或其子类的,对象被声明并创建时,,新生的线程对象处于新建状态,就绪:处于,新建,状态的线程被启动后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件,运行:当就绪的线程被调度并获得处理器资源时,便进入运行状态,,run()方法定义了线程的操作和功能,阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU并临时中止自己的执行,进入阻塞状态,死亡:线程完成了它的全部工作或线程被提前强制性地中止,stop()或destroy(),11,Java的多线程机制,线程的生命周期,12,Java的多线程机制,线程的生命周期(续),Newborn:,线程已创建,但尚未执行,Runnable,:(,就绪),线程已被调度,按优先级和先到先服务原则在,队列中排队等待,CPU,时间片资源,Runnnig,:,正在运行,Blocked:(,阻塞),因某事件或睡眠而被暂时性地挂起,Dead:,正常/强行中断,退出运行状态,13,Java的多线程机制,线程状态,新建状态,new Thread(.),就绪状态,start(),等待状态,执行状态,I/O,sleep(),CPU,调度,run(),结束,stop(),yield(),消亡,I/O,完成,sleep,时间到,14,Java的多线程机制,Java,对多线程的支持,提供对多线程的支持,Thread,类,start( ), stop( ), run( ),Runnable,接口,实现多线程的两种编程方法,继承,Thread,类,实现,R,unnable,接口,15,Java的多线程机制,Thread,类,Thread,类,综合了,Java,程序中一个,线程需要拥有的属性和方法,当,生成一个,Thread,类的对象,后,一个,新的线程诞生,了。,每个线程都是通过,目标对象,的方法,run(),来完成其操作的。,方法,run(),称为,线程体,(线程方法)。,提供线程体的目标对象,是在初始化一个线程时指明的。,任何实现了,Runnable,接口(实现,run(),方法)的,类实例,都可以作为,线程的目标对象,。,16,Java的多线程机制,方法之一:继承,Thread,类,Thread,类的重要方法:,r,un( ),定义线程的具体操作,系统调度此线程时自动执行,初始时无具体操作内容,如何编程呢?,继承,Thread,类,定义,run( ),方法,17,Java的多线程机制,Easy? Lets try it!,小例子:,SimpleThread.java,TwoThreadsTest.java,18,Java的多线程机制,public class,SimpleThread,extends Thread,public,SimpleThread(String,str,) ,super(str,); ,/,创建具以,str,为名字的线程,public void run(), /,定义,run(),方法,for (int i = 0; i 10; i+) ,System.out.println(i,+ +,getName,();,try /,休眠一段时间,sleep(int)(Math.random,() * 1000);, catch (,InterruptedException,e) ,System.out.println(DONE,! +,getName,();,/,SimpleThread.java,public class,TwoThreadsTest,public static void main (String,args,) ,new,SimpleThread,(Take,it myself?).,start();,new,SimpleThread(Give,it to police!).start();,/,TwoThreadsTest.java,19,Java的多线程机制,Thread,类,java.lang,包,构造函数,Thread();,Thread(String,threadname,);,指定线程实例名,线程的优先级控制,三个常量:,MAX_PRIORITY 10;,MIN _PRIORITY 1;,NORM_PRIORITY 5;,getPriority,(),返回线程优先值,setPriority(int,newPriority,),改变线程的优先级,线程创建时继承父线程的优先级,20,Java的多线程机制,Thread,类的有关方法,void start():,由,Newborn,到,Runnable,启动线程,String,getName,():,返回线程的名称,run():,线程在被调度时执行的操作,static void sleep(,指定时间毫秒):,令当前,活动线程在指定时间段内放弃对,CPU,控制,使,其他线程有机会被执行,时间到后重排队,产生例外,InterruptedException,用,try,块调用,sleep(),,用,catch,块处理例外,21,Java的多线程机制,Thread,类的有关方法(续),suspend() :,挂起线程,处于阻塞状态,resume():,恢复挂起的线程,重新进入就绪队,列排队,应用:可控制某线程的暂停与继续,方法:设一状态变量,suspendStatus,=false,(,初始,),暂停:,if(!suspendStatus,),T.suspend();,suspendStatus,=true;,继续:,if(suspendStatus,),T.resume();,suspendStatus,=false;,22,Java的多线程机制,Thread,类的有关方法(续),static void yield():,对正在执行的线程,若就绪队列中有与当前线程,同优先级,的排队线程, 则当前线程让出,CPU,控制权,移到队尾,若队列中没有同优先级的线程,忽略此方法,stop():,强制线程生命期结束,boolean,isAlive,():,返回,boolean,表明是否线程还,存在,static,currentThread,():,返回当前线程,23,Java的多线程机制,生成与运行线程 方法1,MyThread,mt,= new,MyThread,();,mt.,start,();,class,MyThread,extends Thread,public void run(),线程体,执行,run(),方法,24,Java的多线程机制,建立线程,线程控制,(虚拟,CPU),线程代码,被操作数据,Thread,类的,子类的实例,(,mt,),Thread,类的,子类,提供 的,run,方法,Thread,子类实例(,mt,),25,Java的多线程机制,Thread,类方法总结,启动线程:,start(),有关线程执行的控制:,stop(),、suspend()、resume(),有关调度控制,Thread.sleep(10); /,低优先级的线程也可以获得执行,Thread.yield(); /,同优先级的线程可以获得执行,suspend(); /,暂停本线程,26,Java的多线程机制,方法之二:,Runnable,Runnable,接口,自定义类,(,该类,),实现,Runnable,接口,使用,Thread,类的另一构造函数,:,Thread(Runnable,String),用实现了,Runnable,接口的类的对象中所定义的,run(),方法,来,覆盖新创建的线程对象的,run(),方法,使用,start(),启动线程,27,Java的多线程机制,方法之二:,Runnable,(,续,),例:,class,A implements,Runnable,public void run().,class B ,public static void main(String,arg,),Runnable,a=new A();,Thread t=new Thread(a);,t.start,();,用,实现了,Runnable,接口,的类的,对象中所定义的,run(),方,法, 来覆盖新创建的,线程对象的,run(),方法,28,Java的多线程机制,建立线程例,public class,ThreadTest,public static void main(String,args,),Job1 j = new Job1();,Thread t1 = new Thread(j),;,t1.start(),;, ,class,Job1 implements,Runnable,int i =1 ;,public void run() ,while (i50) ,System.out.println(i,+) ; ,29,Java的多线程机制,建立线程,线程控制,(虚拟,CPU),线程代码,被操作数据,Thread,的实例(,t1),由实现了,Runnable,接口,的,类(,Job1),提供,run,方法,实现,Runnable,接口的类,(,Job1),的实例 (,j ),30,Java的多线程机制,生成与运行线程 方法2,class,MyRun,implements,Runnable,public void run() ,线程体,MyRun,mr,= new,MyRun,();,Thread t1 = new,Thread(mr,) ;,t1.start(); /Thread,实例用于线程控制,适合于:,定义,run(),方法的类必须是其他类,或,其他类的子类。,31,Java的多线程机制,方法之二:,Runnable,(,续,),两种方法的选择,当需要从其他类,如,Applet,类继承时,使用,Runnable,接口,当编写简单的程序时,可考虑使用继承,Thread,类,例:,RaceApplet.java,具体运行结果(线程调度)与平台有关,32,Java的多线程机制,public class Runner extends Thread ,/,赛跑者线程类,public int tick = 1;,public void run() ,while (tick 40000000),tick+;,/Runner.java,/,RaceApplet,是一个实现了多线程的,Applet,public class,RaceApplet,extends Applet implements,Runnable,final static int NUMRUNNERS = 2;,/,定义赛跑线程的个数,final static int SPACING = 20;,/,声明两个赛跑线程,Runner runners = new RunnerNUMRUNNERS;,/,声明一个画图线程,Thread,updateThread,= null;,33,Java的多线程机制,public void init(),/,重载,Applet,的,init(),方法,for (int i = 0; i NUMRUNNERS; i+) ,runnersi = new Runner();,/,创建赛跑线程线程,runnersi.setPriority(i+1);,/,设优先级,first=1,second=2,if (,updateThread,= null) ,/创建绘图线程,并设,优先级为3,updateThread,= new Thread(this, Thread Race);,updateThread.setPriority(NUMRUNNERS+1);,addMouseListener(new,MyAdapter,();,/,注册事件监听者,/,end of init(),34,Java的多线程机制,/ 内部事件监听者类,监听鼠标事件,class,MyAdapter,extends,MouseAdapter,/,鼠标点击后,开始赛跑及绘制线程,public void,mouseClicked(MouseEvent,evt,) ,if (!,updateThread.isAlive,(),updateThread.start,();,/,启动绘制线程,for (int i = 0; i NUMRUNNERS; i+) ,if (!,runnersi.isAlive,(),runnersi.start();,/,启动赛跑线程,/,end of class,MyAdapter,35,Java的多线程机制,public void paint(Graphics,g) ,/paint(),方法中绘制框架, ,/,end of paint(),/update(),方法中绘制赛跑者的进度,public void update(Graphics,g) ,for (int i = 0; i NUMRUNNERS; i+) ,/,画两条线,g.drawLine(SPACING, (i+1)*SPACING,SPACING + (runnersi.tick)/100000, (i+1)*SPACING);,/end of update(),36,Java的多线程机制,public void run(),/,实现,Runnable,接口的,run(),方法,while (true) ,repaint();,/,重新绘制,自动调用,update(),方法,try ,Thread.sleep(10);,/,休眠,把执行机会让给低优先级线程,catch (,InterruptedException,e) ,/end of run(),public void stop(),/,重载,Applet,的,stop(),方法,for (int i = 0; i NUMRUNNERS; i+) ,if (,runnersi.isAlive,(),runnersi = null;,/,中止赛跑线程,if (,updateThread.isAlive,(),updateThread,= null;,/,中止绘图线程,/,end of stop(),/,RaceApplet.java,37,Java的多线程机制,线程的同步与互斥,问题的提出,多个线程执行的不确定性引起执行结果的,不稳定,如线程,A: A1,A2,线程,B: B1,B2,多个线程对内存、数据的共享,会造成操,作的不完整性,会破坏数据。,如,push(a): i+; numi=a; pop():,取出,numi;i-;,38,Java的多线程机制,线程的同步与互斥,问题的解决,同步: 用,synchronized,关键字前缀给针对共享资源的操作加锁;同步方法、同步块,synchronized void push();,synchronized int pop();,临界区,实现机制:管程,39,Java的多线程机制,线程的同步与互斥,对象互斥锁,在,Java,中,每个对象有一个“互斥锁”,该锁可用来保证在同一时刻只能有一个线程访问该对象。,锁的使用过程(当一个线程要操作一个对象时),准备,加锁,对象是否,已加锁,加锁,进入,临界区,执行操作,解锁,否,是,40,Java的多线程机制,线程的同步与互斥,加锁1 (临界区-方法),synchronized,方法名 进入该方法时加锁,加锁2(临界区-代码块),方法名,.,synchronized(this) /,进入该代码段时加锁,.,一个线程为某对象加锁后,便对该对象具有了监控权。,41,Java的多线程机制,线程的同步与互斥,线程间需协调与通讯:生产者,/消费者问题,进队,出队,生产者,消费者,42,Java的多线程机制,线程的同步与互斥,wait(),与,notify(),Object,类的方法:,public final void,wait():,令当前线程挂起并放弃管程,同步资源解锁,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问,notify(),唤醒正在排队等待资源管程的线程中优先级最高者,使之执行并拥有资源的管程,wait() + notify() +,标志,变量:可协调、同步不同线程的工作,43,Java的多线程机制,线程的同步与互斥,主线程,线程1( ),线程2( ),操作对象,共享数据(队),synchronized,同步方法1(生产),wait() notify(),synchronized,同步方法2(消费),wait() notify(),44,Java的多线程机制,线程的同步与互斥,public final void,wait,(),方法,在当前线程中调用方法: 对象名.,wait(),使当前线程进入等待(某对象)状态 ,直到另一线程对该对象发出,notify(,或,notifyAll,),为止。,调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁),当前线程将释放对象监控权 ,然后进入等待队列(,wait,队列)。,在当前线程被,notify,后,要重新获得监控权,然后从断点处继续代码的执行。,45,Java的多线程机制,线程的同步与互斥,public final void,notify,(),方法,在当前线程中调用方法: 对象名.,notify(),功能:唤醒等待该对象监控权的一个线程。,调用方法的必要条件:当前线程必须具有对该对象,的监控权(加锁),notifyAll,(),唤醒,wait,队列中的所有线程,并把它门移入锁申请,队列。,46,Java的多线程机制,线程状态,新建状态,就绪状态,start(),等待状态,执行状态,CPU,调度,run(),结束,消亡,等待状态,对象,wait(),池,等待状态,对象,lock,池,wait(),notify(),synchronized(),解锁,sleep(),join(),yield(),47,Java的多线程机制,线程调度,public static void sleep(long,millis,),当前进程休眠指定时间,public static void yield(),主动让出,CPU,,重新排队,正在执行的线程将,CPU,让给其他具有相同优先级的线程,自己进入就绪状态重新排队,public final void join(),等待某线程结束,48,Java的多线程机制,等待另一线程结束,Runnable,ot,= new,otheeThread,() ;,Thread,tt,= new,Thread(ot,) ;,tt.start,();, /,执行自己的工作,try ,tt.join,() ;, catch(,interruptedException,e),. /,继续做自己的事,49,Java的多线程机制,终止线程,public class R implement,Runnable,private,boolean,timeToQuit,=false ; /,设标记,public void run() ,while (!,timeToQuit,) ,public void,stopRunning,() ,timeToQuit,=true;,public class test ,public static void main(String,args,) ,Runnable,r = new R();,Thread t = new Thread(r) ;,t.start() ;,if (),r.stopRunning,() ;, ,50,Java的多线程机制,线程的同步与互斥,Wait_Notify,程序,CubbyHole.java,创建用户的线程子类,Producer:,产生数据(存数据),;,Consumer:,消费数据(,取数据),CubbyHole,类,共享数据区,同步方法,put(int value),方法,int get(),方法,主类中创建共享数据对象,并启动两线程,51,Java的多线程机制,class,CubbyHole,private int,seq,;,/,共享数据,private,boolean,available = false;,/,条件标志变量,public synchronized int get(),/,取数据的同步方法,get(),while( available= =false ),try,wait( );,/,条件不符合,则,wait,catch(,InterruptedException,e ) ,available = false;,/,修改条件,notify( );,/,通知唤醒其他等待管程的线程,return,seq,;,/,返回要取出的数值,/,end of get(),52,Java的多线程机制,/,存放数据的同步方法,put(),public synchronized void put(int value),while( available= =true ),try,wait( );,/,条件不符合,则,wait,catch(,InterruptedException,e ) ,seq,= value;,/,把共享变量修改为要放置的数据,available = true;,/,修改条件,notify( );,/,通知唤醒其他等待管程的线程,/,end of put(),/end of class,CubbyHole,53,Java的多线程机制,class Producer extends Thread ,/,生产者线程类,private,CubbyHole,cubbyhole;,private int number;,public,Producer(CubbyHole,c, int number) ,cubbyhole = c; this.number = number;,public void run() ,/,定义,run(),方法,for (int i = 0; i 10; i+) ,/,共产生10个,cubbyhole.put(i);,System.out.println(Producer,#+this.number + put: + i);,try ,sleep(int)(Math.random() * 100);, catch (,InterruptedException,e) ,/end of class Producer,54,Java的多线程机制,class Consumer extends Thread ,/,消费者线程类,private,CubbyHole,cubbyhole;,private int number;,public,Consumer(CubbyHole,c, int number) ,cubbyhole = c;,this.number = number;,public void run() ,/,定义,run(),方法,int value = 0;,for (int i = 0; i 10; i+),/,消费10个,value = cubbyhole.get();,System.out.println(Consumer,#+this.number+ got: +value);,/end of class Consumer,55,Java的多线程机制,class,ProducerConsumerTest,/,主类:,测试,public static void main(String,args,) ,CubbyHole,c = new,CubbyHole,();,/the shared data object,Producer p1 = new Producer(c, 1);,/Producer,线程,Consumer c1 = new Consumer(c, 1);,/Consumer,线程,p1.start();,/,启动生产者线程,c1.start();,/,启动消费者线程,/,end of,ProducerConsumerTest,程序执行结果:,生产者线程和消费者线程严格地轮流执行,获得了线程间的协调执行。,56,Java的多线程机制,线程的死锁,死锁,不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁,解决方法,专门的算法、原则,尽量减少同步资源的定义,57,Java的多线程机制,动画,即若干幅相近的图片接连显示,例:旋转的地球,RollEarth.java,58,Java的多线程机制,public class,RollEarth,extends Applet implements,Runnable, ,public void run() ,/,实现动画, ,while (true),/,循环往复地显示每一帧图片,try ,displayImage(m_Graphics,);,m_nCurrImage,+;,if (,m_nCurrImage,= = NUM_IMAGES),m_nCurrImage,= 0;,Thread.sleep(50);, catch (,InterruptedException,e) ,/end of run(), ,/end of class,59,Java的多线程机制,课后作业,P202.,第11、12、13题,60,Java的多线程机制,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!