JAVA多线程学习--生产者消费者问题
2013-11-23 14:39
681 查看
一、问题描述
生产者消费者问题是一个典型的线程同步问题。生产者生产商品放到容器中,容器有一定的容量(只能顺序放,先放后拿),消费者消费商品,当容器满了后,生产者等待,当容器为空时,消费者等待。当生产者将商品放入容器后,通知消费者;当消费者拿走商品后,通知生产者。
二、解决方案
对容器资源加锁,当取得锁后,才能对互斥资源进行操作。
生产者消费者问题是一个典型的线程同步问题。生产者生产商品放到容器中,容器有一定的容量(只能顺序放,先放后拿),消费者消费商品,当容器满了后,生产者等待,当容器为空时,消费者等待。当生产者将商品放入容器后,通知消费者;当消费者拿走商品后,通知生产者。
二、解决方案
对容器资源加锁,当取得锁后,才能对互斥资源进行操作。
public class ProducerConsumerTest { public static void main(String []args){ Container con = new Container(); Producer p = new Producer(con); Consumer c = new Consumer(con); new Thread(p).start(); new Thread(c).start(); } } class Goods{ int id; public Goods(int id){ this.id=id; } public String toString(){ return "商品"+this.id; } } class Container{//容器采用栈,先进后出 private int index = 0; Goods[] goods = new Goods[6]; public synchronized void push(Goods good){ while(index==goods.length){//当容器满了,生产者等待 try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } goods[index]=good; index++; notifyAll();//当生产者放入商品后通知消费者 } public synchronized Goods pop(){ while(index==0){//当容器内没有商品是等待 try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } index--; notifyAll();//当消费者消费了商品后通知生产者 return goods[index]; } } class Producer implements Runnable{ Container con = new Container(); public Producer(Container con){ this.con=con; } public void run(){ for(int i=0; i<20; i++){ Goods good = new Goods(i); con.push(good); System.out.println("生产了:"+good); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } class Consumer implements Runnable{ Container con = new Container(); public Consumer(Container con){ this.con=con; } public void run(){ for(int i=0; i<20; i++){ Goods good=con.pop(); System.out.println("消费了:"+good); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
相关文章推荐
- JAVA学习第二十七课(多线程(六))- 多生产者多消费者问题(JDK1.5新特性)
- JAVA学习第二十七课(多线程(六))- 多生产者多消费者问题(JDK1.5新特性)
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- Java多线程学习之生产者消费者问题(一)
- Java 多线程 生产者消费者问题
- 多线程经典案例——生产者/消费者问题的Java实现与详解
- 继续java多线程——生产者消费者类似问题
- java 生产者消费者问题-多线程与死锁
- java多线程学习之生产者与消费者(二)
- java多线程之生产者消费者经典问题
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
- 用JAVA中的多线程示例生产者和消费者问题
- java多线程(3)生产者消费者问题(二)
- 多线程经典问题之生产者消费者问题的JAVA实现
- java多线程-生产者消费者经典问题 基于BlockingQueue
- Java 多线程:生产者消费者问题
- java多线程之生产者消费者问题
- 用JAVA实现多线程(生产者与消费者问题)
- 【java 多线程】多线程并发同步问题及生产者、消费者问题
- java多线程之生产者消费者经典问题