java_ch11

上传人:da****ge 文档编号:243096117 上传时间:2024-09-15 格式:PPT 页数:30 大小:480KB
返回 下载 相关 举报
java_ch11_第1页
第1页 / 共30页
java_ch11_第2页
第2页 / 共30页
java_ch11_第3页
第3页 / 共30页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,教材,:,雍俊海,. ,Java,程序设计教程,.,北京,:,清华大学出版社, 2007.,Java,程序设计,Programming in Java,王文豪,计算机工程学院,wangwenhao1407,9/15/2024,1,教材,雍俊海,.,Java,程序设计教程,.,北京,:,清华大学出版社, 2007.,9/15/2024,2,第,11,章 多线程程序设计,王文豪,计算机工程学院,wangwenhao1407,9/15/2024,3,本章总体纲要,编写线程程序,线程的生命周期,多线程的同步处理,多线程的同步问题,9/15/2024,4,线程的基本概念,9/15/2024,5,线程程序编写,构造线程类的方式主要有两种:,构造,java.lang.Thread,的子类,构造实现接口,java.lang.,Runnable,的类,9/15/2024,6,通过类,Thread,构造线程类,线程程序执行代码,public void run( ),启动线程,public void start( ),示例(,J_Thread.java),9/15/2024,7,通过接口,Runnable,构造线程类,类声明形式,public class A extends B implements,Runnable,/ .,public void run( ),/ .,9/15/2024,8,通过接口,Runnable,构造线程类,构造和启动线程的方法,A a = new A( );,Thread t = new Thread(a);,t.start( );,示例(,J_,ThreadRunnable,),A,为实现接口,Runnable,的类,9/15/2024,9,后台,(,daemon),线程,线程分为后台线程或用户线程,后台线程又称为守护线程或精灵线程,类,java.lang.Thread,的成员方法,public final,boolean,isDaemon,( ),类,java.lang.Thread,的成员方法,线程切换,public final void,setDaemon,(,boolean,on),该,方法的调用必须在调用类,java.lang.Thread,的成员方法,后台线程,用户线程,9/15/2024,10,线程组,线程可以通过线程组来进行管理,类,java.lang.,ThreadGroup,的构造方法,public,ThreadGroup,(String name),public,ThreadGroup,(,ThreadGroup,parent, String name),将一个线程添加到一个线程组,一般是通过线程类,java.lang.Thread,的构造方法,public,Thread(,ThreadGroup,group, String name),示例(,J_,ThreadGroup,.java),9/15/2024,11,本章总体纲要,编写线程程序,线程的生命周期,多线程的同步处理,多线程的同步问题,9/15/2024,12,线程的生命周期,9/15/2024,13,线程的优先级,三个与线程优先级有关的静态量,MAX_PRIORITY,:,最大优先权,值为,10,;,MIN_PRIORITY,:,最小优先权,值为,1,;,NORM_PRIORITY,:,默认优先权,值为,5,Thread,类中几个常用的有关优先级的方法,Void,setPriority,(,int newPriority,)/,重置线程优先级,Int getPriority,()/,获得当前线程的优先级,Static void yield()/,使当前线程放弃执行权,9/15/2024,14,线程的操作方法,start(),启动线程对象;,run(),用来定义线程对象被调度之后所执行的操作,用户必须重写,run(),方法;,yield(),强制终止线程的执行;,isAlive,(),测试当前线程是否在活动;,sleep(,int millsecond,),使线程休眠一段时间,时间长短由参数所决定;,void Wait(),使线程处于等待状态;,9/15/2024,15,本章总体纲要,编写线程程序,线程的生命周期,多线程的同步处理,多线程的同步问题,9/15/2024,16,多线程共享内存引发的问题,通常,一些同时运行的线程需要共享数据,每个线程就必须要考虑与他一起共享数据的其他线程的状态与行为,否则不能保证共享数据的一致性,从而不能保证程序的正确性。,内存或资源冲突,脏数据,9/15/2024,17,多线程同步的基本原理,9/15/2024,18,对象锁,对象互斥锁” (又称为监视器、管程),实现不同线程对共享数据操作的同步。“对象互斥锁”阻止多个线程同时访问同一个条件变量。,Java,为每一个对象的实例配有一个“对象互斥锁”,实现“对象互斥锁”两种方法,用关键字,volatile,来声明一个共享数据(变量);,用关键字,synchronized,来声明一个操作共享数据的方法或一段代码。,9/15/2024,19,在多线程同步中的静态方法和非静态方法,如果同步方法是静态方法则与类对象相关联,如果同步方法是非静态方法则实例对象相关联,这两个对象拥有不同的对象锁,在相同时刻这两个对象会允许线程同时分别进入并运行这两个对象的同步方法.这两个对象锁是互不相关的,分别被相应的对象控制.,对于非同步方法,不受对象锁的限制,允许多个线程同时进入并运行这些方法,示例(同时具有同步静态方法和非静态方法),9/15/2024,20,在多线程同步中同一个实例对象的多个同步方法,在任何相同的时刻最多只能有一个线程进入这些同步方法,示例,J_,SynchronizedMethod,.java,9/15/2024,21,同步语句块,同步语句块的定义格式如下,:,synchronized (,引用类型的表达式,),语句块,基于类对象的同步语句块进行线程的同步的例程,基于实例对象的同步语句块的例程,使用同步语句块但线程同步不成功,9/15/2024,22,方法,wait/notify/,notifyAll,方法的锁定并不能保证两种不同的方法互斥。要使这个方法不会被同时执行,可在这两个方法(或其中的一个)方法中用操作标志决定是执行操作还是进入等待状态。,可调用,notify,方法,唤醒在,wait,状态的线程。如果有多个线程在,wait,状态,可调用,notifyall,将他们全部唤醒,。,方法,wait,Public final void wait() throws,InterrupteredException,Public final void wait(,lont,timeout) throws,InterrupteredException,Public final void wait(,lont,timeout,int,nanos,) throws,InterrupteredException,方法,notify:,只激活在该对象的等待集中的1个线程,方法,notifyAll,:,激活在该对象的等待集中的所有线程,J_,WaitNotify,9/15/2024,23,生产者和消费者,public class Box,private,int,value;,public void put(,int,value),this.value=value;,public,int,get(),return this.value;,public class Producer extends Thread ,private Box box;,private String name;,public Producer(Box b, String n) ,box = b;,name=n;,public void run() ,for (,int,i = 1; i 6; i+) ,box.put(i);,System.out.,println,(Producer + name,+ produced: + i);,try ,sleep(,int,)(Math.random() * 100);, catch (,InterruptedException,e),e.,printStackTrace,();,public class Consumer extends Thread ,private Box box;,private String name;,public Consumer(Box b, String n) ,box=b;,name=n;,public void run() ,int,value = 0;,for (,int,i = 1; i 6; i+) ,value = box.get();,System.out.,println,(Consumer +name,+ consumed: + value);,try ,sleep(,int,)(Math.random() * 100);, catch (,InterruptedException,e) ,e.,printStackTrace,();,public class,ProducerConsumerTest,public static void main(String,args,) ,Box box = new Box();,Producer p= new Producer(box,p);,Consumer c= new Consumer(box,c);,p.start();,c.start();,Producer p produced: 1,Consumer c consumed: 1,Producer p produced: 2,Consumer c consumed: 2,Consumer c consumed: 2,Consumer c consumed: 2,Producer p produced: 3,Producer p produced: 4,Consumer c consumed: 4,Producer p produced: 5,9/15/2024,24,生产者和消费者,public class Box,private,int,value;,public synchronized void put(,int,value),this.value=value;,public synchronized,int,get(),return this.value;,Producer p produced: 1,Consumer c consumed: 1,Producer p produced: 2,Consumer c consumed: 2,Producer p produced: 3,Producer p produced: 4,Producer p produced: 5,Consumer c consumed: 5,Consumer c consumed: 5,Consumer c consumed: 5,9/15/2024,25,生产者和消费者,public synchronized,int,get() ,if (available = true) ,available = false;,return value;,public synchronized void put(,int,value) ,if (available = false) ,available = true;,this.value = value;,9/15/2024,26,生产者和消费者,public class Box,private,int,value;,private,boolean,available=false;,public synchronized,int,get() ,while (available = false) ,try ,/,等待生产者写入数据,wait();, catch (,InterruptedException,e) ,e.,printStackTrace,();,available = false;,/,通知生产者数据已经被取走,可以再次写入数据,notifyAll,();,return value;,public synchronized void put(,int,value) ,while (available = true) ,try ,/,等待消费者取走数据,wait();, catch (,InterruptedException,e) ,e.,printStackTrace,();,this.value = value;,available = true;,/,通知消费者可以来取数据,notifyAll,();,9/15/2024,27,本章总体纲要,编写线程程序,线程的生命周期,多线程的同步处理,多线程的同步问题,9/15/2024,28,多线程的同步问题,死锁问题:由于程序设计不合理而造成程序的所有线程都陷入等待或阻塞状态,死锁两种情况:每个线程都占有若干个资源的同时等待若干个资源,而等待的资源都被其他线程所控制,每个线程都处于阻塞状态;所有线程都处于等待状态或阻塞状态,但是缺乏线程来唤醒他们,。,为了避免死锁出现。死锁的原因是使用资源的无序造成的,粒度问题,9/15/2024,29,谢谢,9/15/2024,30,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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