JAVA课件第13章

上传人:二*** 文档编号:243096243 上传时间:2024-09-15 格式:PPT 页数:28 大小:285KB
返回 下载 相关 举报
JAVA课件第13章_第1页
第1页 / 共28页
JAVA课件第13章_第2页
第2页 / 共28页
JAVA课件第13章_第3页
第3页 / 共28页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,第一级,第二级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,多线程,回顾,事件模式,事件处理机制,常用事件应用,2,目标,了解多线程的概念,掌握如何创建线程,了解死锁的概念,掌握线程同步,掌握使用,wait(),和,notify(),在线程之间进行通信,3,多任务处理,进程是指一种,“,自包容,”,的运行程序,有自己的地址空间;线程是进程内部单一的一个顺序控制流,基于进程的特点是允许计算机同时运行两个或更多的程序。,基于线程的多任务处理环境中,线程是最小的处理单位。,多任务处理有两种类型:,- 基于进程,- 基于线程,4,基于线程的多任务处理的优点,基于线程所需的开销更少,在多任务中,各个进程需要分配它们自己独立的地址空间,多个线程可共享相同的地址空间并且共同分享同一个进程,进程间调用涉及的开销比线程间通信多,线程间的切换成本比进程间切换成本低,5,多线程,多线程,在,Java,中,一个应用程序可以包含多个线程。每个线程执行特定的任务,并可与其他线程并发执行,多线程使系统的空转时间最少,提高,CPU,利用率,多线程编程环境用方便的模型隐藏,CPU,在任务间切换的事实,6,主线程,在,Java,程序启动时,一个线程立刻运行,该线程通常称为程序的主线程。,主线程的重要性体现在两个方面:,它是产生其他子线程的线程。,通常它必须最后完成执行,因为它执行各种关闭动作。,7,主线程示例,class,Mythread,extends Thread,public static void,main(String,args,) ,Thread t=,Thread.currentThread,();,System.out.println,(,当前线程是:,+,t);,t.setName(MyJavaThread,);,System.out.println,(,当前线程名是:,+,t);,try ,for(int,i=0;i3;i+) ,System.out.println(i,);,Thread.sleep(1500);,catch(InterruptedException,e) ,System.out.println,(,主线程被中断,); ,获得当前线程,即主线程,改变线程的内部名称,输出每个数后暂停1500毫秒,8,创建线程,通过以下两种方法创建,Thread,对象:,-,声明一个,Thread,类的子类,并,覆盖,run(),方法。,class,mythread,extends Thread ,public void run( ) ,/*,覆盖,该方法*/,- 声明一个实现,Runnable,接口的类,并实现,run(),方法。,class,mythread,implements,Runnable,public void run( ) ,/*,实现该方法*/,9,创建线程,要触发一个新线程,使用,start(),方法,如:,Mythread,t = new,Mythread,();,t.start,();,在调用,start(),方法时,将创建一个新的控制线程,接着它将调用,run(),方法。,run(),方法中的代码定义执行线程所需的功能。,10,创建线程示例,class MyThread1,extends Thread,public static void,main(String,args,) ,Thread t=,Thread.currentThread,();,System.out.println,(,主线程是:,+,t);,MyThread1 ex = new MyThread1();,ex.start,();,public void run() ,System.out.println,(,子线程是,:+,this);,或者使用,implements,Runnable,11,线程的状态,新建 (,Born),:,新建的线程处于新建状态,就绪 (,Ready),:,在创建线程后,它将处于就绪状态,等待,start(),方法被调用,运行 (,Running),:,线程在开始执行时进入运行状态,睡眠 (,Sleeping),:,线程的执行可通过使用,sleep(),方法来暂时中止。在睡眠后,线程将进入就绪状态,12,线程的状态,新建(,New),:,当创建对象时,处于,New(Thread,),状态,它是线程的起点。,可运行(,Runnable,),:,调用,start,方法就使线程处于,Runnable,状态,并不意味着线程立即运行,这是线程的第二个状态。,运行 (,Running),:,如果系统的线程调度程序允许线程运行,(,即给线程分配了,CPU,时间,),那么这时线程才开始,Running(,运行,),否则仍然处于,Runnable,状态。,阻塞,(Blocked):,已经运行中的线程因为某种原因暂时停止运行,这是处于,Blocked,状态,.,13,可能使线程暂停执行的条件,线程:,线程优先级比较低,因此它不能获得,CPU,时间。,使用,sleep( ),方法使线程睡眠。,通过调用,wait( ),方法,使线程等待。,通过调用,yield( ),方法,线程已显式出让,CPU,控制权。,线程由于等待一个文件,I/O,事件被阻塞。,14,线程状态的示例,class,ThreadStateDemo,extends Thread,Thread t;,public,ThreadStateDemo,() ,t=new,Thread(this,);,System.out.println,(,线程,t,为新建!,);,System.out.println,(,线程,t,为就绪!,);,t.start,();,public void run() ,try ,System.out.println,(,线程,t,在运行!,);,t.sleep(500);,System.out.println,(,线程,t,在短时间睡眠后重新运行!,);,catch (,InterruptedException,IE) ,System.out.println,(,线程被中断,);,public static void,main(String,args,) ,new,ThreadStateDemo,();,15,Thread,类中的重要方法,方法,用途,static,int,enumerate(Thread, t),将线程所在的线程组及其子组中所有活动的线程复制到指定数组中,返回线程的个数,final String,getName,( ),返回线程的名称,final,boolean,isAlive,(),如果线程是激活的,则返回,true,final void,setName(String,name),将线程的名称设置为由,name,指定的名称,final void join( ) throws,InterruptedException,等待线程结束,16,Thread,类中的重要方法,方法,用途,final,boolean,isDaemon,( ),检查线程是否为精灵线程,final void,setDaemon(boolean,on),根据传入的参数,将线程标记为精灵线程或用户线程,static void sleep( ),用于将线程挂起一段时间,void start( ),调用,run( ),方法启动线程,开始线程的执行,static,int,activeCount,( ),返回激活的线程数,static void yield(),使正在执行的线程临时暂停,并允许其他线程执行,17,线程优先级,Java,中的线程优先级是在,Thread,类中定义的常量,NORM_PRIORITY,:,值为 5,MAX_PRIORITY,:,值为,10,MIN_PRIORITY,:,值为,1,缺省优先级为,NORM_PRIORITY,有关优先级的方法有两个,:,final void,setPriority(int,newp,),:,修改线程的当前优先级,final,int,getPriority,(),:,返回线程的优先级,18,线程同步,有时两个或多个线程可能会试图同时访问一个资源,例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数据,在此情况下,数据可能会变得不一致,为了确保在任何时间点一个共享的资源只被一个线程使用,使用了“同步”,19,如何在,Java,中获得同步,同步基于“监视器”这一概念。“监视器”是用作互斥锁的对象。在给定时刻,只有一个线程可以拥有监视器。,Java,中所有的对象都拥有自己的监视器,两种方式实现同步:,使用同步方法,synchronized void,methodA,() ,使用同步块,synchronized(object,) ,/,要同步的语句,20,同步方法,class One ,synchronized void,display(int,num),System.out.print(+num,);,try ,Thread.sleep(1000);,catch(InterruptedException,e) ,System.out.println,(,中断,);,System.out.println,(,完成,);,进入某一对象的监视器,就是调用被,synchronized,关键字修饰的方法。,class Two implements,Runnable,int,number;,One,one,;,Thread t;,public,Two(One,one_num,int,n) ,one=,one_num,;,number=n;,t=new,Thread(this,);,t.start,();,public void run() ,one.display(number,);,public class Synch ,public static void,main(String,args,) ,One,one,=new One();,int,digit=10;,Two s1=new,Two(one,digit,+);,Two s2=new,Two(one,digit,+);,Two s3=new,Two(one,digit,+);,s1.t.join();,s2.t.join();,s3.t.join();,21,同步块,如果无法在相关方法前加,synchronized,修饰符,只需将对这个类定义的方法的调用放入一个,synchronized,块内就可以了。,class One ,void,display(int,num),System.out.print(+num,);,try ,Thread.sleep(1000);,catch(InterruptedException,e),System.out.println,(,中断,);,System.out.println,(,完成,);,class Two implements,Runnable,int,number;,One,one,;,Thread t;,public,Two(One,one_num,int,n) ,one=,one_num,; number=n;,t=new,Thread(this,);,t.start,();,public void run() ,synchronized(one,) ,one.display(number,);,22,死锁,当两个线程循环依赖于一对同步对象时将发生死锁。例如:,一个线程进入对象,ObjA,上的监视器,而另一个线程进入对象,ObjB,上的监视器。如果,ObjA,中的线程试图调用,ObjB,上的任何,synchronized,方法,就将发生死锁。,死锁很少发生,但一旦发生就很难调试。,23,wait-notify,机制,为避免轮流检测,,Java,提供了一个精心设计的线程间通信机制,使用,wait()、notify,(),和,notifyAll,(),方法 。,这些方法是作为,Object,类中的,final,方法实现的。,这三个方法仅在,synchronized,方法中才能被调用。,24,wait-notify,机制,wait(),方法告知被调用的线程退出监视器并进入等待状态,直到其他线程进入相同的监视器并调用,notify( ),方法。,notify( ),方法通知同一对象上第一个调用,wait( ),线程。,notifyAll,(),方法通知调用,wait(),的所有线程,具有最高优先级的线程将先运行。,25,使用,wait-notify,机制示例,class,ChopStick,boolean,available;,ChopStick,() available=true; ,public,synchronized,void,takeup,() ,while(!available,) ,try ,wait();,System.out.println,(,哲学家等待另一根筷子,);,catch(InterruptedException,e) ,available=false;,public,synchronized,void putdown() ,available=true;,notify();,26,总结,多线程允许程序员编写可最大程度利用,CPU,的高效程序。,Java,以类和接口的形式为多线程提供内置支持。,Java,程序启动时,一个线程立刻运行,该线程称为主线程。,可通过两种方式创建线程:继承,Thread,类、实现,Runnable,接口,。,27,总结,Thread 类,的有两个构造函数。,线程的缺省优先级为,5。,作为后台线程并为其他线程提供服务的线程称为精灵线程。,同步是用于确保资源一次只能被一个线程使用的过程。,wait-notify,机制,用来处理线程间通信,28,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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