问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java 线程中wait和notify的问题

发布网友 发布时间:2022-05-01 20:48

我来回答

1个回答

热心网友 时间:2022-06-23 04:00

这个程序挺经典的.

我不知道你对wait这是不是很熟,我按我的说,有问题再沟通:

首先看
main函数,两句话,Procer对象和Consumer对象都引用了同一个p.
Procer类的run
前面有
synchronized(p)
说明该线程用到 synchronized 里的对象变量时,别的线程只能等待.
再看
if(p.bFull) {
try{p.wait();} catch (Exception e) {}
}
也就是说该线程用到了p对象,
而如果当运行到该线程时,
且p.bFull为真时
该线程进行等待,让其他线程运行

到这的思路如果没有问题,
那么我们假设
假设
p.bFull为假,
那么会再往下运行
也就是设置姓名,性别,
此时p.bFull仍然为假

之后设置 p.bFull 为真
p.notify()
当设置p.bFull为真时,表示下次如果仍然是该线程执行,将会wait.
而p.notify()是为了解以p为锁的线程,因为当前线程正在运行,所以当前线程肯定不需要解锁,那可能需要被解锁的,也就是Consumer对象的线程.

当前线程从开始运行到目前的位置,Consumer线程是一直在wait的,因为Consumer线程在while下面直接就synchronized (p)也就是这两个线程同时只能一个线程运行.
也就是说,要么这次运行Procer,要么运行Consumer
按我上面说的,Procer的运行逻辑应该已经清楚了,而Consumer的线程运行逻辑跟Procer一样,我就不多说了,

问题的关键在于
当Procer运行一次,之后Consumer运行一次,是比较好理解,交叉运行呗.
但如果Procer运行完,又运行了Procer线程,而没有让Consumer运行的时候,程序会怎么运行?(反之一样)
我下面来解释.
当Procer运行一次,又运行了Procer时,这时因为没有Consumer线程的介入
,p的bFull应该为真,
这时运行到
Procer线程的
if (p.bFull) {
try {
p.wait();
} catch (Exception e) {
}
时,因为p.bFull为真了,
所以运行下面的代码,
也就是让当前线程等待,而用来等待的锁就是p
这时,当前线程等待了,
也就要执行Consumer线程了,也就是相当于强制切换线程
运行一次Consumer线程后,Procer仍然在等待,如果这样,那就会仍然运行Consumer线程,根据逻辑,Consumer会像Procer一样,由于
if(!p.bFull) {
try{p.wait(); } catch (Exception e) {} }
而等待
这样两个线程都等待了
(如果你问,当!p.bFull如果成立,那p.bFull就不成立,那Procer不是该运行了吗?但是,我刚刚的假设是当Procer已经等待时,那么Procer就不会因为p.bFull的改变而继续运行了)

按上面所说,如果按这样的逻辑,最终会导致两个线程同时等待没有解锁,
为了解决这个问题,
就在程序的每个线程的
p.bFull = false;
后面,加上了
p.notify();
让以p为锁的线程解锁等待.
这样,就可以使程序的两个线程来回切换了.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
离过年还有2个月,是找工作,还是等过年? 还有两个多月就过年了,我是现在找工作呢还是过完年再找呢?现在找工作是... i57300u处理器属于什么水平 i5-7300u处于什么水平 国家线2024考研分数线是多少 电脑软件使用记录如何查看电脑当天的使用记录 在哪里查电脑最近使用情况怎么查看笔记本电脑的使用记录 英语题急求 ...以前都是以1MB/s速度下载,但是现在都不到300K/s,是不是WiFi路由器... 我家4兆的网线1台电脑可是我今天测网速时却只有16KB/S 这是为什么啊 什么时候用 Java 自旋锁 被限制登录,一般要多久才能自动解除? 微信转账到另外一个显示对方限制登录要怎么解 给对方转账显示对方已被*登录,给对方发信息却能收到,这是怎么回事? 对方被限制登录是什么意思? 在steam购买的地牢守护者4个副本,怎么将余下的发给好友 地牢守护者的学徒(法师)的终极武器怎么刷? 地牢守护者PC版,最后那两个锁着的职业怎么选 能记录人的走路步数的软件 血小板低可吃什么中药 近视会改变黑眼珠吗? 我的眼睛天生很大,,但由于近视导致黑眼珠变小了死鱼眼实在太明显,有 33层楼选25层还是13层好 黑眼球会不会变小? 33层高层我买13楼好不好呢? 戴眼镜黑眼珠会变小吗 13层楼好么? 33层楼是选25层好还是13层好?求住过的人根据居住情况分析一下,买房大事,恳请各位多多指教。万分感谢 近视眼会导致眼睛萎缩变小吗? 33层的高楼中的11层,18层13层好吗? java 中1、一个线程调用了wait(),随后被notify()唤醒,这个线程会接着执行wait java多线程wait和notify问题 Java多线程中await和wait的区别 汕头高威电子科技有限公司怎么样? 汕头超声印制板公司怎么样? 汕头超声显示器有限公司怎么样? 汕头超声显示器技术有限公司怎么样? 汕头超声显示器(二厂)有限公司怎么样? 为什么自建微信群,在清除数据后会消失 汕头超声电子(集团)公司怎么样? 汕头超声印制板(二厂)有限公司怎么样? 四川超声印制板有限公司怎么样? 微信群自己就消失了,是啥原因 汕头超声老板叫什么 我自己健的微信群,没有保存通讯录,也没清理聊天记录就没了,好友那里也没了,是? 孩子写不好作文怎么办啊? 孩子作文写得不好怎么办? 孩子作文写不好该怎么办? 孩子初二,作文不好怎么办? 初中生作文写不好咋办