生产者与消费的问题,是线程编程的一个经典问题。生产者生产,消费者消费,当生产满的时候,生产者要停止生产,等待消费者消耗掉产品后再继续生产,消费者发现没有产品可以消费的时候,也必须等待,等待生产者生产出产品才能购买,看看下面的例子
package com.thread;
import java.util.Random;
/**
* 生产者与消费者实例
*
* @author Administrator
*
*/
public class ProducerAndConsumer {
public static void main(String[] args) {
ProductHeap ph = new ProductHeap();
Random random = new Random();
Producer p = new Producer(ph, random);
Consumer c = new Consumer(ph, random);
new Thread(p).start();
new Thread(p).start();
new Thread(c).start();
}
}
/**
* 产品类
*
* @author Administrator
*
*/
class Product {
public int id;
public Product(int id) {
this.id = id;
}
@Override
public String toString() {
return "产品:" + id;
}
}
/**
* 产品堆
*
* @author Administrator
*
*/
class ProductHeap {
int index = 0;
Product proArr[] = new Product[6];
public synchronized void push(Product product) {
// 如果产品满了
while (index == proArr.length) {
System.out.println("产品堆满了,消费者快买");
try {
// 当前线程等待
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notifyAll();
proArr[index] = product;
index++;
}
public synchronized Product pop() {
while (index == 0) {
System.out.println("没产品了,快生产");
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notifyAll();
return proArr[--index];
}
}
class Producer implements Runnable {
private ProductHeap ph;
private Random random;
public Producer(ProductHeap ph, Random random) {
this.ph = ph;
this.random = random;
}
int i = 0;
@Override
public void run() {
while (true) {
Product product = new Product(i++);
ph.push(product);
System.out.println("生产了:" + product);
try {
Thread.sleep((random.nextInt(3) * 500));
} catch (Exception e) {
}
}
}
}
class Consumer implements Runnable {
private ProductHeap ph;
private Random random;
public Consumer(ProductHeap ph, Random random) {
this.random = random;
this.ph = ph;
}
@Override
public void run() {
while (true) {
Product p = ph.pop();
System.out.println("消费了:" + p);
try {
Thread.sleep((random.nextInt(3) * 500));
} catch (Exception e) {
}
}
}
}