package com.xdclass.communication.demo2; public class Consumer implements Runnable { private Medium medium; public Consumer(Medium medium){ this.medium = medium; } @Override public void run() { while (true){ medium.take(); } } }
package com.xdclass.communication.demo2; /** * 中间商 */ public class Medium { private int num = 0;//库存 private static final int TOTAL = 20;//最大容量 /** * 生产 */ public synchronized void put(){ //判断当前库存,是否已经是最大的库存容量, if(num <TOTAL){ // 如果不是,生产完成后,通知消费者消费 System.out.println("新增库存----------->当前库存"+ ++num); notifyAll(); }else{ //如果是,通知生产者停止生产 try { System.out.println("新增库存----------->库存已满"+num); wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 消费 */ public synchronized void take(){ //判断当前库存,是否不足, if(num>0){ // 如果充足,在消费完成后通知生产者进行生产 System.out.println("消费库存--------------->当前库存容量"+ --num); notifyAll(); }else{ //如果不足,通知消费者暂停消费 System.out.println("消费库存--------------->当前库存容量"+ num); try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
package com.xdclass.communication.demo2; public class Producer implements Runnable{ private Medium medium; public Producer(Medium medium){ this.medium = medium; } @Override public void run() { while (true){ medium.put(); } } }
package com.xdclass.communication.demo2; public class Main { public static void main(String[] args) { Medium medium = new Medium(); new Thread(new Consumer(medium)).start(); new Thread(new Consumer(medium)).start(); new Thread(new Consumer(medium)).start(); new Thread(new Producer(medium)).start(); new Thread(new Producer(medium)).start(); new Thread(new Producer(medium)).start(); new Thread(new Producer(medium)).start(); new Thread(new Producer(medium)).start(); new Thread(new Producer(medium)).start(); new Thread(new Producer(medium)).start(); } }