生产者消费者问题,是一个多线程同步问题的经典案例。
该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。
/**
* 放苹果取苹果
*/
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();
}
}
|
|