线程没有调用notifyAll()时,它是怎么被唤醒的?

线程没有调用notifyAll()时,它是怎么被唤醒的?

http://img1.sycdn.imooc.com//climg/5d8c90050936f13616860792.jpg这些程序 就算不加那两个 唤醒方法notifyAll(),程序也能往下执行很多步 才出现死锁。    那么一个线程 调用了wait()方法 处于等待状态时,并且没有调用notifyAll()时,它是怎么被唤醒的呢???

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,这里并不是被唤醒的哦~因为在前面的执行过程中,第一次flag等于false时,表示没有数据产生,数据为空,此时线程不进入等待,所以执行下面生产数据的代码,进入生产数据,生产完毕,容器中已经有数据, flag设置为true,线程执行进行消费,只有flag判断为ture时,进行消费,线程在前面的过程中可能会出现交换执行,这个是随机的,也可能会出现一开始就被阻塞哦~

但这里,两个的线程在执行过程可能会出现,当前线程自己调用了wait()方法进行等待了,会在中途执行另一个线程,这时当前线程为false,而另一个线程可能flag还没执行到为true时,但是同一时间都想要争夺CPU资源来进行生产和消费,就造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。所以要添加notifyAll()进行唤醒线程~

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


  • 电磁护盾 提问者 #1
    谢谢,我明白了。麻烦再看一下我对这个程序的表达,看看我理解的对不对。 ............................1、有两个线程,其中每个线程只执行一种方法。 如果不使用notifyAll()方法,只有两个线程交替执行,一人执行一次自己的方法时(这样保证每个线程都不满足if条件,每个线程都能跳过if语句),这样才能使两个线程一直执行下去。 2、一旦有一个线程抢到了更多CPU的使用时间,连续执行两次自己的方法,就会满足if条件,进入if语句执行wait()方法。 3、在这个程序中,一个线程一旦执行wait()方法,并且没有notifyAll()方法唤醒时,这个线程就永远处于等待状态了。 4、当一个线程调用wait()方法,进入等待状态时,就无法让两个线程交替执行了。另一个线程也会连续执行两次另一个线程的方法,从而进入等待状态。这样两个线程就都进入了等待状态。
    2019-09-26 21:33:07
  • 好帮手慕酷酷 回复 提问者 电磁护盾 #2
    同学你好,你的理解是正确的!继续努力!如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-09-27 09:45:03
提问者 电磁护盾 2019-09-26 19:00:27

http://img1.sycdn.imooc.com//climg/5d8c99e0099bbf5a18150527.jpg

这道题里还说使用wait()方法阻塞的线程,必须用notify()或notifyAll()方法进行唤醒。那么之前没调用notify()或notifyAll()方法的线程是怎么往下执行那么多步的?

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师