《Java多线程管理》PPT幻灯片_第1页
《Java多线程管理》PPT幻灯片_第2页
《Java多线程管理》PPT幻灯片_第3页
《Java多线程管理》PPT幻灯片_第4页
《Java多线程管理》PPT幻灯片_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、1,第三讲,线程管理,2,本章目标,线程的优先级: 优先级概述 线程优先级的具体应用 线程同步: 线程同步的目的 线程同步的具体应用 线程死锁: 产生死锁的必要条件与解决方法 wait和notify机制,3,线程优先级,多线程运行时需要定义线程运行的先后顺序 线程优先级是用数字表示,数字越大线程优先级越高,取值在(1到10)。 默认优先级(为5)。,4,优先级应用一,public class PriThread public static void main(String args ) ThreadA a=new ThreadA(); ThreadB b=new ThreadB(); a.se

2、tPriority(2);/设置优先级别,数值越大优先级越高 b.setPriority(3); a.start(); b.start(); ,5,优先级应用二,class ThreadA extends Thread public void run() System.out.println(我是线程A); class ThreadB extends Thread public void run() System.out.println(我是线程B); 因为在代码段当中我们把线程B的优先级设置高于线程A,所以运行结果先执行线程B的run()方法后再执行线程A的run()方法。,6,线程优先级的

3、获得,JAVA中获得线程优先级的方法,是通过getPriority()方法来实现的。 public class PriThread public static void main(String args ) Thread a=new Thread(); Thread b=new Thread(); int priA=a.getPriority();/获得优先级的方法 int priB=b.getPriority(); System.out.println(priA); System.out.println(priB); ,7,线程常量设置优先级,设置优先级也可以用线程常量。 MAX_PRIOR

4、ITY为最高优先级10; MIN_PRIORITY为最低优先级1; NORM_PRIORITY是默认优先级5。,8,线程常量设置优先级示例,public class PriConstant public static void main(String args ) Thread a=new Thread(); int temp=Thread.MAX_PRIORITY; a.setPriority(temp);/设置此线程优先级最高 System.out.println(a.getPriority(); temp=Thread.MIN_PRIORITY; a.setPriority(temp);

5、/设置此线程优先级最低 System.out.println(a.getPriority(); temp=Thread.NORM_PRIORITY; a.setPriority(temp);/将线程优先级设置为默认 System.out.println(a.getPriority(); ,9,线程安全问题,public class Piao public int num; public Piao(int num) this.num = num; public void sell(String name) if(num=0) return; System.out.println(name+卖+n

6、um); try Thread.sleep(10); catch (InterruptedException e) e.printStackTrace(); num=num-1; ,10,安全问题的解决,Java中嵌套同步是安全的 同步化方法 同步块的方式: void method() synchronized(this) / 同步方法: synchronized void method() / ,11,同步原理,synchronized (object) / 钥匙在对象中,而不在代码中。 每个对象有一个钥匙 为了执行synchronized()块,线程需要得到对象中的钥匙。一旦获得了钥匙,对

7、象就不再拥有钥匙。 如果当线程要执行synchronized()时,钥匙不在对象中,线程就wait。一直到钥匙还到了对象中,才被这个线程拿到。 当线程离开synchorized()块,钥匙就还给了对象。,12,阶段回顾,线程优先级的概念? 什么是线程同步?如何实现线程同步? 实现同步的要点: 两个线程对相同的公共资源进行访问。 通过同步公共资源的访问方法实现线程安全。,13,死锁的必要条件与解决方法,死锁图,P1、P2表示两个线程,R1、R2表示资源,P1已经占用资源R1而且在等待R2,P2已经占用资源R2而且在等待R1,这时就会产生两个线程互相等待的状态。,14,wait和notify机制,

8、实际应用中,多线程之间常常需要互相协调工作。例如生产者和消费者的问题。 在JAVA中,这个机制的实现依赖于wait()/notify()方法。 synchronized(obj) while(!condition) obj.wait(); obj.doSomething(); ,15,Wait与notify示例,以生产产品面包为例。 class Bread private int id; public Bread(int id) this.id = id; public String toString() return 面包+id; ,16,Wait与notify示例,面包是放在一个篮子中,篮

9、子满了生产者必须等待,篮子空了,消费者必须等待。两者之间互相要有通讯。 class Basket private Bread breads = new Bread6; private int index = 0; ,17,Wait与notify示例,生产方法push public synchronized void push(Bread bread) if(index = breads.length) try this.wait(); catch (InterruptedException e) e.printStackTrace(); breadsindex = bread; index+;

10、 System.out.println(生产了+bread); this.notify(); ,18,Wait与notify示例,消费方法pop() public synchronized void pop() try Thread.sleep(1); catch (InterruptedException e1) e1.printStackTrace(); if(index = 0) try this.wait(); catch (InterruptedException e) e.printStackTrace(); index-; Bread bread = breadsindex; S

11、ystem.out.println(消费了+bread); this.notify(); ,19,Wait与notify示例,生产者 class Producer implements Runnable private Basket basket; public Producer(Basket basket) this.basket = basket; public void run() for(int i=0;i20;i+) Bread bread = new Bread(i); basket.push(bread); ,20,Wait与notify示例,消费者 class Consumer

12、 implements Runnable private Basket basket; public Consumer(Basket basket) this.basket = basket; public void run() for(int i=0;i20;i+) basket.pop(); ,21,Wait与notify示例,测试类: public class TestProducerConsumer public static void main(String args) Basket basket = new Basket(); Producer producer = new Producer(basket); Consumer consumer = new Consumer(basket); Thread thread = new Thread(prod

温馨提示

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

评论

0/150

提交评论