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(); } }