ReentrantLock和Condition 实现生产者 运输者 消费者
2021/8/24 23:38:13
本文主要是介绍ReentrantLock和Condition 实现生产者 运输者 消费者,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
生产者、运输者、消费者 三个线程协作
使用公平锁实现,
Condition 条件限制。
/** * 三个线程,一个生产商 A 一个中间商B 一个消费者C * 生产商 每次生产1个商品 * 中间商每次运送 2个商品 ,消费者每次消费3个商品 * 如果梳理不满足 则不运送 不消费 */ public class ThreePersionLockCondition { private final static ReentrantLock lock = new ReentrantLock(true); private static Condition condition = lock.newCondition(); private static Condition condition1 = lock.newCondition(); private static Queue<String> queue = new ArrayDeque<>(); private static Queue<String> queue2 = new ArrayDeque<>(); public static void main(String[] args) throws InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(9); Runnable target; Thread a = new Thread(new Produce(lock, queue, condition)); a.start(); executorService.submit(new Produce(lock, queue, condition)); executorService.submit(new Middleman(lock, queue, queue2, condition)); executorService.execute(new Consumer(lock, queue2, condition)); executorService.shutdown(); executorService.awaitTermination(60, TimeUnit.SECONDS); } } /** * 生产者 */ class Produce implements Runnable { Lock lock; Queue<String> queue; Condition condition; public Produce(Lock lock, Queue<String> queue, Condition condition) { this.lock = lock; this.queue = queue; this.condition = condition; } @Override public void run() { while (true) { lock.lock(); try { while (queue.size() < 2) { queue.add("1"); System.out.println("生产1个产品"); Thread.sleep(1000); System.out.println("----生产队列剩余:" + queue.size()); condition.signal(); } condition.await(); } catch (final Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } } } /** * 中间商 */ class Middleman implements Runnable { Lock lock; Queue<String> queue; Queue<String> queue2; Condition condition; public Middleman(Lock lock, Queue<String> queue, Queue<String> queue2, Condition condition) { this.lock = lock; this.queue = queue; this.queue2 = queue2; this.condition = condition; } @Override public void run() { while (true) { lock.lock(); try { while (queue.size() > 1) { System.out.println("运输2个产品"); String a = queue.poll(); String b = queue.poll(); queue2.add(a); queue2.add(b); condition.signalAll(); } condition.await(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } } } /** * 消费者 */ class Consumer implements Runnable { Lock lock; Queue<String> queue2; Condition condition; public Consumer(Lock lock, Queue<String> queue2, Condition condition) { this.lock = lock; this.queue2 = queue2; this.condition = condition; } @Override public void run() { while (true) { lock.lock(); try { while (queue2.size() > 2) { for (int i = 0; i < 3; i++) { System.out.println("消费产品:" + queue2.poll()); } System.out.println("消费完成3个产品"); System.out.println("-----------消费队列剩余:" + queue2.size()); condition.signal(); } condition.await(); } catch (Exception e) { } finally { lock.unlock(); } } } }
这篇关于ReentrantLock和Condition 实现生产者 运输者 消费者的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-08CCPM如何缩短项目周期并降低风险?
- 2025-01-08Omnivore 替代品 Readeck 安装与使用教程
- 2025-01-07Cursor 收费太贵?3分钟教你接入超低价 DeepSeek-V3,代码质量逼近 Claude 3.5
- 2025-01-06PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”
- 2025-01-05Easysearch 可搜索快照功能,看这篇就够了
- 2025-01-04BOT+EPC模式在基础设施项目中的应用与优势
- 2025-01-03用LangChain构建会检索和搜索的智能聊天机器人指南
- 2025-01-03图像文字理解,OCR、大模型还是多模态模型?PalliGema2在QLoRA技术上的微调与应用
- 2025-01-03混合搜索:用LanceDB实现语义和关键词结合的搜索技术(应用于实际项目)
- 2025-01-03停止思考数据管道,开始构建数据平台:介绍Analytics Engineering Framework