黑马程序员技术交流社区

标题: 多线程中关于notifyAll()的疑问 [打印本页]

作者: 肖居上    时间: 2011-10-31 15:32
标题: 多线程中关于notifyAll()的疑问
对于notifyAll(),是不是可以在程序的任何地方,任何处于wait()状态中的任务都将被任何对notify()的调用所唤醒呢?
作者: 黄健    时间: 2011-10-31 15:35
而且这些线程必须监视同一个监视器
作者: 白倩    时间: 2011-10-31 15:54
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用
作者: 姚志华    时间: 2011-10-31 15:56
wait(),notifyAll()是Object类的方法所有的类都继承的有,所以可以在任何时候被任任何线程调用!
wait()和notify()、notifyAll()

这三个方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用这三个方法。前面说过Synchronized这个关键字用于保护共享数据,阻止其他线程对共享数据的存取。但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出Synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。

wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。当调用 notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有

锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。

notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。


作者: 欧阳文愿    时间: 2011-11-16 12:09
notifyAll()通知线程中所有对象,多数情况下可调用,如果你要用notify,但是又有多个在等待,为保证其正确的行为,可以使用wait()和notify调用,把wait()放在while()循环中,在线程唤醒和无事情要做时确保正确行为。{:soso_e112:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2