1. 生产者
/**
* 生产者
*/
public class Producter implements Runnable{
private static final long PUODUCT_SPEED = 1000; // 生产速度
private Stock stock; // 库存
public Producter(Stock stock){
this.stock = stock;
}
@Override
public void run() {
// 不停的生产
while(true){
Goods g = Goods.create();
g.setProducter("Pro_" + Thread.currentThread().getId());
stock.add(g);
System.out.println(Thread.currentThread().getName() + " 生产商品:id=【" + g.getId() + "】 名称=【" + g.getName() + "】 生产者=【" + g.getProducter() + "】");
try {
Thread.sleep(PUODUCT_SPEED);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2. 消费者
/**
* 消费者
*/
public class Consumer implements Runnable{
private static final long CONSUME_SPEED = 10000; // 消费速度
private Stock stock;
public Consumer(Stock stock){
this.stock = stock;
}
@Override
public void run() {
// 不停的消费
while(true){
Goods g = stock.get();
System.out.println(Thread.currentThread().getName() + " 消费商品:id=【" + g.getId() + "】 名称=【" + g.getName() + "】 生产者=【" + g.getProducter() + "】");
try {
Thread.sleep(CONSUME_SPEED);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
3.互斥资源
import java.util.ArrayList;
/**
* 库存(互斥资源)
*/
public class Stock {
private final int MAX = 10;
private ArrayList<Goods> stock = new ArrayList<Goods>(MAX);
/**
* 从仓库里消费一个
* @return
*/
public synchronized Goods get(){
// 已无库存
while(stock.size()<=0){
try {
System.out.println(Thread.currentThread().getName() + " 没有库存了,等待中...size=" + stock.size());
// 等待新增资源
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Goods g = stock.remove(stock.size()-1);
// 呼唤其它线程
this.notifyAll();
return g;
}
/**
* 向仓库里添加一个
* @param g
*/
public synchronized void add(Goods g){
// 库存已满
while(stock.size()>=MAX){
try {
System.out.println(Thread.currentThread().getName() + " 库存满了,等待消费...size=" + stock.size());
// 等待消费资源
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
stock.add(g);
// 呼唤其它线程
this.notifyAll();
}
}
实例下载: http://download.csdn.net/detail/ggcrazy/7791713