多线程Java和面试第3部分:等待并通知所有人

108 篇文章 1 订阅
102 篇文章 0 订阅

在这里,请阅读有关“等待”和“ NotifyAll”同步的概念的介绍。

我们学习了如何使用Wait和Notify方法来创建线程安全的阻塞队列。但是在所描述的示例中,我们只有1个使用者(John线程)和1个生产者(Peter线程)。在这一部分中,我们考虑另一个示例,该示例包含2个消费者和1个生产者。这部分的主要目的是学习通知所有功能以及Java Monitor如何处理这种情况。

等待并通知所有详细说明
让我介绍三个主线
参与者:John1,John 2(消费者)和Peter(生产者)

在我们的实现中,我们有三个线程。两个线程将启动并尝试从队列中获取数据。只要队列为空,它们两个都将等到生产者线程Peter将2条记录推入队列中。

在这里插入图片描述

现在让我们详细描述每个线程步骤的执行

但首先,请看一下实现。它几乎与前一篇文章相同,只是有一个区别-现在,生产者在一个调用中添加了2条记录。
在这里插入图片描述

第一阶段

John1和John2尝试合并数据,但是由于队列空而被阻塞。

请记住,不能保证John1将首先获得MUTEX。John2线程在John1之前具有良好的更改以获取互斥体。右侧的说明说明了每个线程的当前位置及其状态。
在这里插入图片描述
至此,第一步就完成了。现在,我们有2个线程处于WAITING状态。1秒后,我们启动了Peter的线程。该生产者线程将在队列中添加2条新记录,并执行Notify All方法来唤醒2个正在等待的线程。
在这里插入图片描述
现在,两个使用者(John1,John2)都被锁定,并且下一刻,他们中的一个(随机一个)将获取互斥量。
在这里插入图片描述
因此,现在该过程结束,并且两个john线程使用者都已完成。我希望这些阶段能够详细描述等待/阻止/通知的过程。

参考: 《2020最新Java基础精讲视频教程和学习路线!》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值