| 1、可以在一个锁里面,存在多种等待条件 |
| 2、主要的方法: |
| await 挂起 |
| signal 随机唤醒1个线程 |
| signalAll 唤醒所有等待的线程 |
| |
| |
| |
| public class Producer implements Runnable{ |
| |
| private Medium medium; |
| |
| public Producer(Medium medium) { |
| this.medium = medium; |
| } |
| |
| @Override |
| public void run() { |
| while (true) { |
| medium.put(); |
| } |
| } |
| |
| } |
| |
| |
| |
| |
| public class Consumer implements Runnable{ |
| |
| private Medium medium; |
| |
| public Consumer( Medium medium) { |
| this.medium = medium; |
| } |
| |
| @Override |
| public void run() { |
| while (true) { |
| medium.take(); |
| } |
| } |
| |
| } |
| |
| |
| |
| |
| 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); |
| |
| try { |
| Thread.sleep(500L); |
| } catch (InterruptedException e) { |
| e.printStackTrace(); |
| } |
| 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); |
| try { |
| Thread.sleep(1000L); |
| } catch (InterruptedException e) { |
| e.printStackTrace(); |
| } |
| producerCondition.signalAll(); |
| } else { |
| |
| try { |
| System.out.println("消费库存---------> 库存不足:" + num); |
| consumerCondition.await(); |
| } catch (InterruptedException e) { |
| e.printStackTrace(); |
| } |
| } |
| } finally { |
| lock.unlock(); |
| } |
| } |
| |
| } |
| |
| # 测试类 |
| 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 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(); |
| } |
| |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)