/** * Created by damon on 7/25/16. * 生产者消费者 测试 */ public class Producer_Consumer_test3 { /* 知识点(以下知识点随便百度都能找到): 0.生产者消费者模型的理解 1.wait notify 的用法 2.synchronized 的用法 3. wait和sleep的区别 */ public static void main(String[] args) { Operation operation = new Operation(); new Thread(new ConsumerThread(operation)).start(); new Thread(new ProducerThread(operation)).start(); } static class Good { /** * 商品的id */ public int id; public Good(int id) { this.id = id; } } static class Operation { /** * 仓库的最大的存储数据量 */ static final int MAX_NUMBER = 10; Good[] goods = new Good[MAX_NUMBER]; /** * 当前仓库的个数 */ private int currNumber = 0; public synchronized void produce(Good good) { while (currNumber == MAX_NUMBER) { try { System.out.println("===仓库满了!!!停止生产,仓库最大容量-->>"+MAX_NUMBER); wait(); } catch (InterruptedException e) { e.printStackTrace(); } } currNumber++; System.out.println("===生产一个,仓库最大容量-->>"+MAX_NUMBER+", 当然仓库数量-->>"+currNumber); goods[currNumber - 1] = good; notify(); } public synchronized void consume() { while(currNumber==0){ try { System.out.println("===仓库为空了!!!等待中..."); wait(); } catch (InterruptedException e) { e.printStackTrace(); } } currNumber--; goods[currNumber] = null; System.out.println("===消费一个!!!仓库还有"+currNumber+"个"); notify(); } } /** * 生产产品的线程 */ static class ProducerThread implements Runnable { private Operation operation; private int id; public ProducerThread(Operation operation) { this.operation = operation; } @Override public void run() { while(true) { try { operation.produce(new Good(id)); id++; Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * 消费产品的线程 */ static class ConsumerThread implements Runnable { private Operation operation; public ConsumerThread(Operation operation) { this.operation = operation; } @Override public void run() { while(true) { try { operation.consume(); Thread.sleep(2400L); } catch (InterruptedException e) { e.printStackTrace(); } } } } }