黑马程序员技术交流社区
标题:
多线程间通信
[打印本页]
作者:
冯国强
时间:
2013-11-16 16:57
标题:
多线程间通信
多线程间的通信,毕老师讲授的生产者与消费者两个线程,唤醒所有线程notifyAll方法唤醒进程,本质是什么?为什么使用notifyAll方法唤醒会解决多个线程生产,多个线程消费之间的安全问题呢?为什么老师说唤醒所有线程要重新判断是否有物品?
作者:
hubby
时间:
2013-11-16 17:54
notifyAll是唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。 这个就是Object中的一个唤醒方法,而且notifyAll必须前提是在监视器上,所以在Synchronized这个监视器里面才会运行。
如果有多个线程,只用notify唤醒的话会导致多个线程全部等待在哪,全都放弃执行资格。原因你可以重新听一遍视频里毕老师加完while后再加notifyAll那一段(细说确实很麻烦)。就是说只要一个线程进去之后执行完就唤醒所有在这个监视器上等待的线程,避免线程发生类似于死锁的情况,无法继续运行。
作者:
唐宋元明清
时间:
2013-11-16 19:05
唤醒所有线程notifyAll方法唤醒进程,本质是什么?
答:本质就是所有线程都启动,谁抢到cpu谁就执行。
为什么使用notifyAll方法唤醒会解决多个线程生产,多个线程消费之间的安全问题呢?
因为如果你使用notify方法只唤醒所有线程中的一个线程,这个线程可能是生产者的。而生产者有个判断就是如果生产了但是没消费掉的话,生产者就陷入冻结,这样就是我刚把生产者另一个线程唤醒然后我沉睡,另外那个线程醒了后一看库房里的东西还没被消费掉,那么接着陷入冻结。就有可能生产者和消费者都冻结了,那程序就停了不继续运行了。使用notifyAll就是把生产者和消费者都唤醒,然后它们抢cpu谁抢到谁执行,这样就不会所有线程都冻结了。多个线程之间因为有同步,所以不会有安全问题。
为什么老师说唤醒所有线程要重新判断是否有物品?
因为刚睡醒大家都不知道到底库房里有没有东西,所以需要使用while语句让线程醒来第一件事就是判断库房里到底有没有东西。
如果有东西说明生产者其中的某个线程刚生产过,那么我冻结等消费者线程抢到cpu后消费掉库房里的东西;如果没东西说明消费者刚消费过,那么生产者当中谁活着谁就生产。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2