- 可以在一个锁里面,存在多种等待条件
- 主要的方法 await signal signalAll
-
package com.xdclass.communication.demo6; 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.demo6; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 中间商 */ public class Medium { private int num = 0;//库存 private static final int TOTAL = 20;//最大容量 private Lock lock = new ReentrantLock(); private Condition consumerCondition = lock.newCondition(); private Condition producerCondition = lock.newCondition(); /** * 生产 */ public void put(){ lock.lock(); try { //判断当前库存,是否已经是最大的库存容量, if(num <TOTAL){ // 如果不是,生产完成后,通知消费者消费 System.out.println("新增库存----------->当前库存"+ ++num); consumerCondition.signalAll(); }else{ //如果是,通知生产者停止生产 try { System.out.println("新增库存----------->库存已满"+num); producerCondition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } }finally { lock.unlock(); } } /** * 消费 */ public void take(){ lock.lock(); try{ //判断当前库存,是否不足, if(num>0){ // 如果充足,在消费完成后通知生产者进行生产 System.out.println("消费库存--------------->当前库存容量"+ --num); producerCondition.signalAll(); }else{ //如果不足,通知消费者暂停消费 System.out.println("消费库存--------------->当前库存容量"+ num); try { consumerCondition.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } }finally { lock.unlock(); } } }
-
package com.xdclass.communication.demo6; 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.demo6; 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(); } }
Condition的使用
最新推荐文章于 2021-07-04 00:10:06 发布