这一节的生产者与消费者同步问题

这一节的生产者与消费者同步问题

老师说要用notifyAll,否则可能会唤醒不是我们想要的线程(比如生产者唤醒生产者),我觉得这种情况是不会发生的,在这个例子中用notify方法即可,因为这个例子中只有生产者与消费者两个线程可能处于等待状态(主线程处于阻塞状态),当生产者线程调用唤醒方法的时候,它一定已经是运行状态了,不可能出现再唤醒生产者线程的情况,只能是唤醒消费者线程,同理,消费者线程也是这样。我的理解对不对?

正在回答 回答被采纳积分+1

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

1回答
好帮手慕小班 2019-07-20 14:40:23

        同学你好,1、这里关于线程生产者唤醒生产者,同学的理解是正确的,不会出现生产者唤醒生产者的情况,但是这个例子中不是只有生产者与消费者处于等待状态,主线程也处于等待状态哦!因为这里不是单线程,所以主方法不会是阻塞状态,例如:

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

    2、当你调用notify时,只有一个等待线程会被唤醒而且它不能保证哪个线程会被唤醒,而调用notifyAll方法,那么等待该锁的所有线程都会被唤醒!!

    3、本案例中只有两个线程会执行休眠方法,主方法不会执行休眠,所以本案例中可以使用notify来唤醒线程,生产者执行完成后,调用notify方法,唤醒消费者线程,消费者执行完成后,调用notify方法,唤醒生产者线程!这三个线程会随机获取CPU时间片哦!但是因为主线程中只有生产者和消费者的内容,所以最后的执行效果会是生产者线程和消费者线程来随机获取CPU时间片!

        综上所述,老师会建议同学使用notifyAll唤醒所有线程!

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

  • 提问者 慕粉1474288341 #1
    “但是这个例子中不是只有生产者与消费者处于等待状态,主线程也处于等待状态哦!因为这里不是单线程,所以主方法不会是阻塞状态”什么意思??? 1.主线程既没有调用wait也没有调用sleep方法,它应该一直是在运行和可运行状态来回切换吧? 2.等待状态和阻塞状态不是一回事吗? 3.同样是阻塞状态,但是notify只能唤醒因为调用wait而阻塞的线程吧?
    2019-07-20 15:17:37
  • 好帮手慕小班 回复 提问者 慕粉1474288341 #2
    同学你好,1、运行main方法,启动主线程运行或者创建线程,执行start方法后,都是使线程启动进入可运行状态,等待被选中,获取CPU时间片而开始执行,所以这里的主方法是可运行状态! 2、同学的说法是正确的,主线程既没有调用wait也没有调用sleep方法,所以它是一直在运行和可运行状态来回切换。 3、等待状态和阻塞状态不同哦,阻塞状态是指线程因为某种原因放弃了cpu 使用权,而等待状态是因为某些原因或者还没有CPU使用权,等得到CPU使用权,就可以继续执行了! 4、notify只能唤醒调用了wait方法的线程!这里注意一个小知识点-->如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中. 如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
    2019-07-20 19:01:04
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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