A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 肖居上 黑马帝   /  2011-10-31 15:32  /  2667 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对于notifyAll(),是不是可以在程序的任何地方,任何处于wait()状态中的任务都将被任何对notify()的调用所唤醒呢?

评分

参与人数 1技术分 +1 收起 理由
李印东老师 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
黄健 黑马帝 2011-10-31 15:35:16
沙发
而且这些线程必须监视同一个监视器
回复 使用道具 举报
白倩 黑马帝 2011-10-31 15:54:53
藤椅
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用
回复 使用道具 举报
wait(),notifyAll()是Object类的方法所有的类都继承的有,所以可以在任何时候被任任何线程调用!
wait()和notify()、notifyAll()

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

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

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

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

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
notifyAll()通知线程中所有对象,多数情况下可调用,如果你要用notify,但是又有多个在等待,为保证其正确的行为,可以使用wait()和notify调用,把wait()放在while()循环中,在线程唤醒和无事情要做时确保正确行为。{:soso_e112:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马