假设仓库中只能存放一件产品,生产者将生产出的产品放入仓库,消费者将仓库的中的产品取走。仓库中没有产品,生产者将产品放入仓库,否则停止生成并等待,直到仓库中的产品被消费者取走仓库中存放产品,消费者将产品取出仓库,否则停止消费并等待,直到仓库中再次放入产品
解决办法:管程法
产品
class Product { int id;//产品编号 public Product(int id) { this.id = id; }}
缓存区
//缓冲区class SynContainer { Product[] products = new Product[10]; int count = 0; //容器计数器 //生产者放入产品 public synchronized void push(Product product) { while (count == products.length) { //通知消费者消费,等待生产 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //如果没有满,需要丢入产品 products[count] = product; count++; //通知消费者消费 this.notifyAll(); } //消费者消费产品 public synchronized Product pop() { //判断是否能消费 while (count <= 0) { //等待生产者生产 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //如果可以消费 count--; Product product = products[count]; //吃完了 通知生产者生产 this.notifyAll(); return product; }}
生产者
class Consumer extends Thread { //容缓冲区 SynContainer container; public Consumer(SynContainer container) { this.container = container; } //消费 @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println("消费了-->" + container.pop().id + "件产品"); } }}
产生者
class Producer extends Thread { //容缓冲区 SynContainer container; public Producer(SynContainer container) { this.container = container; } //生产 @Override public void run() { for (int i = 0; i < 20; i++) { container.push(new Product(i)); System.out.println("生产了" + i + "件产品"); } }}
main方法
public class Demo33_ThreadPC { public static void main(String[] args) { SynContainer synContainer = new SynContainer(); new Producer(synContainer).start(); new Consumer(synContainer).start(); }}
运行结果:
生产了0件产品生产了1件产品生产了2件产品生产了3件产品生产了4件产品生产了5件产品生产了6件产品生产了7件产品生产了8件产品生产了9件产品消费了-->9件产品消费了-->10件产品消费了-->8件产品消费了-->7件产品消费了-->6件产品消费了-->5件产品消费了-->4件产品生产了10件产品消费了-->3件产品生产了11件产品消费了-->11件产品生产了12件产品消费了-->12件产品生产了13件产品消费了-->13件产品生产了14件产品消费了-->14件产品生产了15件产品生产了16件产品生产了17件产品消费了-->15件产品消费了-->18件产品消费了-->17件产品消费了-->16件产品消费了-->2件产品消费了-->1件产品消费了-->0件产品生产了18件产品生产了19件产品消费了-->19件产品