A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© empty3717 中级黑马   /  2016-7-14 20:03  /  655 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

生产者消费者问题,是一个多线程同步问题的经典案例。

该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。
/**
* 放苹果取苹果
*/
class Plate {  
    private List<Object> apples = new ArrayList<Object>();  

    public synchronized void putApple(Object apple) {  
        if(apples.size() > 0) {  
            try {  
                wait();  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  

        apples.add(apple);  
        notify();  
        System.out.println("放入了一个苹果");  
    }  

    public synchronized void getApple() {  
        if(apples.size() == 0) {  
            try {  
                wait();  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  

        Object apple = apples.get(0);  
        apples.clear();  
        notify();  
        System.out.println("拿到一个苹果");  
    }  
}  

class Add implements Runnable {  

    private Plate applePlate;  

    private Object apple = new Object();  

    public Add(Plate applePlate) {  
        this.applePlate = applePlate;  
    }  

    @Override  
    public void run() {  
        for(int i=0; i<5;i++) {  

            applePlate.putApple(apple);  
        }  
    }  

}  

class Get implements Runnable {  

    private Plate applePlate;  

    public Get(Plate applePlate) {  
        this.applePlate = applePlate;  
    }  

    @Override  
    public void run() {  
        for(int i=0; i<5;i++) {  
            applePlate.getApple();  
        }  
    }  

}  
public class SynchroTest {  

    public static void main(String args[]) {  

        Plate myPlate = new Plate();  

        new Thread(new Get(myPlate)).start();  
        new Thread(new Add(myPlate)).start();  
    }  
}  

2 个回复

倒序浏览
问题的关键在于,
1、生产者只能在缓存区为空的时候放苹果,消费者只能在缓存区有苹果的时候拿苹果
2、拿苹果和放苹果的过程是互斥的
回复 使用道具 举报
看不懂。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马