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 实现生产者 运输者 消费者的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-25【机器学习(二)】分类和回归任务-决策树(Decision Tree,DT)算法-Sentosa_DSML社区版
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享