2016-08-19-java-关于线程的死锁的案例分析:生产者消费者问题
2016-08-19 21:58
676 查看
同步问题Java解决方案:
同步方法:当线程进入同步方法的时候,会获得同步方法所属的锁,一旦获得对象锁,则其他线程不能再执行被锁对象的其他任何同步方法。
只有在同步方法执行完毕之后释放锁,其他线程才能执行。
同步块:....
版本一(本人自己版):
版本二(改进老师版本,还是自己写的版本。。。。)
同步方法:当线程进入同步方法的时候,会获得同步方法所属的锁,一旦获得对象锁,则其他线程不能再执行被锁对象的其他任何同步方法。
只有在同步方法执行完毕之后释放锁,其他线程才能执行。
同步块:....
版本一(本人自己版):
package com.shi.onclass; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * 关于生产者消费者线程的问题 * 两个对象:做面包的||吃面包的 * 两个方法:吃面包的方法||做面包的方法 * @author Shi * 1.定一个数组对象存放我的面包 * 2.定一个面包个数的最大值 * */ public class Shop { List<String> data = new ArrayList<String>(); public void produce(){ synchronized (data) { if(data.size()>0){ System.out.println("可以卖面包了"); data.notify(); try { data.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } String a = "面包"+System.currentTimeMillis(); data.add(a); System.out.println("生成了:"+a+",找人来吃,现在面包个数为:"+data.size()); //data.notify(); } } public void sale(){ synchronized (data) { if(data.size()==0){ try { System.out.println("没面包了该通知做面包了"); data.notify(); data.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } String s = data.get(0); data.remove(0); System.out.println("吃掉了面包"+s); data.notify(); } } public static void main(String[] args) { Shop shop = new Shop(); Thread productor = new Thread(new Productor(shop)); Thread customer = new Thread(new Customer(shop)); productor.start(); customer.start(); } } class Productor implements Runnable{ Shop shop; public Productor(Shop shop) { super(); this.shop = shop; } @Override public void run() { while(true){ shop.produce(); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // TODO Auto-generated method stub } } class Customer implements Runnable{ Shop shop; public Customer(Shop shop) { super(); this.shop = shop; } @Override public void run() { // TODO Auto-generated method stub while(true){ shop.sale(); try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
版本二(改进老师版本,还是自己写的版本。。。。)
package com.shi.onclass; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * 关于生产者消费者线程的问题 * 两个对象:做面包的||吃面包的 * 两个方法:吃面包的方法||做面包的方法 * @author Shi * 1.定一个数组对象存放我的面包 * 2.定一个面包个数的最大值 * */ public class Shop { List<String> data = new ArrayList<String>(); static final int MAX = 10; public Shop() { for(int i =0 ;i<5;i++){ data.add("面包"+System.currentTimeMillis()); } } public void product(){ synchronized (data) { if(data.size()==MAX){ System.out.println("面包已满!等人吃了在做"); data.notify();//通知吃面包的人来吃面包 try { data.wait();//等吃人吃了,收到做面包的通知再做面包 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return; } String s = "面包"+System.currentTimeMillis(); data.add(s); System.out.println("生成了:"+s+",找人来吃,现在面包个数为:"+data.size()); data.notify(); } } public void eat(){ synchronized (data) { if(data.size()==0){ System.out.println("面包没了,通知人来做"); data.notify();//通知发出 try { data.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return; } String s = data.get(0); data.remove(s); System.out.println("消费了"+s+",并通知生成,还剩面包个数为:"+data.size()); data.notify(); } } public static void main(String[] args) { // TODO Auto-generated method stub Shop shop= new Shop(); Thread productor = new Thread(new Productor(shop)); Thread custmor = new Thread(new Customer(shop)); productor.start(); custmor.start(); } } //生产者线程 class Productor implements Runnable{ Shop shop; Random r = new Random(); public Productor(Shop shop) { super(); this.shop = shop; } @Override public void run() { // TODO Auto-generated method stub while(true){ shop.product(); try { Thread.sleep(100+r.nextInt(200)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } class Customer implements Runnable{ Shop shop; Random r = new Random(); public Customer(Shop shop) { super(); this.shop = shop; } @Override public void run() { // TODO Auto-generated method stub while(true){ shop.eat(); try { Thread.sleep(100+r.nextInt(200)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
相关文章推荐
- java线程基础巩固---多线程死锁分析,案例介绍
- java中线程的同步和死锁案例分析
- 线程高级应用-心得4-java5线程并发库介绍,及新技术案例分析
- 线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析
- java基础9:线程,线程池,原理分析,案例
- 关于Java中线程和进程的讨论1(创建线程和线程特点分析)
- 线程高级应用-心得7-java5线程并发库中阻塞队列Condition的应用及案例分析
- 线程高级应用-心得7-java5线程并发库中阻塞队列Condition的应用及案例分析
- Java线程死锁查看分析方法
- 真实案例:使用Java Thread Dump分析ReadWriteLock导致的死锁问题
- 线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析
- 关于Java线程转储分析
- Java线程死锁查看分析方法
- 使用Java thread dump分析CPU高使用率和线程死锁问题
- 心得3--由售票系统中的抢票机制解说同步线程及死锁案例分析
- java笔记--关于线程死锁
- GCD线程死锁解锁案例分析
- 在Java中,关于Static关键字的案例分析
- 线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析
- JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池