Java 两个线程实现生产者和消费者的问题

news/2024/5/19 0:34:23 标签: 1024程序员节, Reentrantlock, Condition, signal

先简单交代下背景,两个线程实现生产者和消费者的问题,就是给一个固定大小容器,然后生产者开始生产,消费者开始消费,容器满的时候生产者停止生产,容器为空的时候消费者停止消费,等待生产者进行生产

Condition__1">ReentrantLock 的Condition 使用

这里使用Condition来进行实现把,这里基本等同于synchronized的wait notify

    @Test
    public void testProduceAndConsume(){
        ReentrantLock lock = new ReentrantLock();
        Condition condition = lock.newCondition();
        int ans[] = new int[]{0};
        new Thread(()->{
            while (true){
                try {
                    lock.lock();
                    if(ans[0]==0){
                        try {
                            condition.await();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    System.out.println("消费者消费了一条数据"+ans[0]);
                    ans[0]--;
                    condition.signalAll();
                } catch (RuntimeException e) {
                    throw new RuntimeException(e);
                }finally {
                    lock.unlock();
                }
            }
        }).start();
        new Thread(()->{
            while (true){
                try {
                    lock.lock();
                    if(ans[0]==10){
                        try {
                            condition.await();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    ans[0]++;
                    System.out.println("生产者生产了一条数据"+ans[0]);
                    condition.signalAll();
                } catch (RuntimeException e) {
                    throw new RuntimeException(e);
                }finally {
                    lock.unlock();
                }
            }
        }).start();

        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

这里的话就主要练习了下使用ReentrantLock的condition 来实现线程间的通信,当生产者生产了消息之后就通知消费者来进行消费,消费者消费了一条消息之后通知生产者进行生产,这里就体现在signalAll 这里,这里因为只有一个生产者和消费者,所以signalsignalAll没差别
当容器满的时候,生产者进行await,然后等待消费者进行消费,消费者同理,当容器空的时候等待生产者进行生产,因为这里在每次生产一条数据或者消费一条数据之后都会进行唤醒,所以await之前不需要唤醒了,

总结

这里的await 就等于synchronized的wait ,signal等于synchronized的notify,signalAll等于synchronized的notifyAll方法,都需要在持有锁的情况下进行使用


http://www.niftyadmin.cn/n/5119087.html

相关文章

SAP中ABAP标准列表和选择屏幕

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈,…

栈-删除字符串中的所有相邻重复项

1047. 删除字符串中的所有相邻重复项 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一…

Linux下挂载大于2T的硬盘

fdisk和gdisk命令的区别 fdisk和gdisk命令都可以给磁盘分区,但是在公司里,如果磁盘大于2T,不能用fdisk分区,只能用gdisk命令分区。 gdisk可以分128个主分区,用gdisk分区没有逻辑分区和扩展分区之说,只有主…

你的支付环境是否安全?

1、平台支付逻辑全流程分析分析 2、平台支付漏洞如何利用?买东西还送钱? 3、BURP抓包分析修改支付金额,伪造交易状态? 4、修改购物车参数实现底价购买商品 5、SRC、CTF、HW项目月入10W副业之路 6、如何构建最适合自己的网安学习路…

UG\NX二次开发 设置视图中心 UF_VIEW_set_center

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 a1794902437 订阅本专栏,非常感谢。 简介 UG\NX二次开发 设置视图中心 UF_VIEW_set_center。如果视图NULL_TAG,则使用工作视图。 效果 代码 #include &qu…

微信消息弹窗升级优化了,在微信打开时也能收到新消息显示。

最近,微信又更新了。微信对消息弹窗进行了升级优化,在微信打开时也能收到新消息显示。 点击「我」-「设置」-「消息通知」,可以看到新增了「横幅显示内容」选项。 有3种内容显示形式,分别为:仅显示你收到1条消息&#…

实验数据旋转角度处理过程中的常见问题

问题 做实验过程中使用 EM tracker 测量自己机器人末端旋转时的角度。 尾部 设置EMTracker 1,作为固定基准,其轴线与机器人中心轴线近似重合,EM Tracker 2 固定在机器人活动关节上,两者轴线夹角近似为机器人旋转角度。论文尚未发…

生命礼赞,带动世界第三次文化复兴——非洲回顾篇

一个民族的复兴需要强大的物质力量,也需要强大的精神力量。大型玉雕群组《生命礼赞》是对中华民族伟大生命的讴歌,是对百姓美好生活的赞美,完美诠释了中华民族的伟大图腾,它象征着中华民族在党的带领下艰苦奋斗,江山稳…