利用缓冲区解决:管理法
代码
// 生产者,消费者,产品,缓冲区 public class TestPCDemo { public static void main(String[] args) { // 定义容器 SynContainer synContainer = new SynContainer(); // 生产者线程 Thread pThread = new Thread(new Producer(synContainer)); // 消费者线程 Thread cThread = new Thread(new Consumer(synContainer)); // 开启线程 pThread.start(); cThread.start(); } } // 生产者 class Producer implements Runnable { // 容器 SynContainer container; // 构造器 public Producer(SynContainer container) { this.container = container; } // 生产方法 @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("生产了第" + i + "个产品"); container.addProduction(new Production(i)); } } } // 消费者 class Consumer implements Runnable { // 容器 SynContainer container; // 构造器 public Consumer(SynContainer container) { this.container = container; } // 消费方法 @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("消费了第" + container.popProduction().id + "个产品"); } } } // 产品 class Production { // 编号 public int id; public Production(int id) { this.id = id; } } // 缓冲区 class SynContainer { // 需要一个容器大小 Production[] productions = new Production[10]; // 容器计数器 int count = 0; // 生产者放入产品 public synchronized void addProduction(Production p) { // 如果容器满了,需要等待消费者消费 if (count == productions.length) { // 通知消费者,生产等待 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 如果没满就生产 productions[count] = p; ++count; // 有产品就可以通知消费者消费了 this.notifyAll(); } // 消费者消费产品 public synchronized Production popProduction() { // 如果容器没有,需要等待生产者生产 if (count == 0) { // 通知生产者,消费等待 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 如果有就消费 --count; Production production = productions[count]; // 通知生产 this.notifyAll(); // 看看消费的是什么 return production; } }