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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马连家华 中级黑马   /  2012-3-24 17:28  /  1390 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如何判断多线程的notify唤醒哪一个线程,notify又是如何唤醒线程的?

4 个回复

倒序浏览
只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒。
不可以对不同锁中的线程进行唤醒。

也就是说,等待和唤醒必需是同一个锁
回复 使用道具 举报
是不是最先进入线程池中的线程最先被唤醒?
回复 使用道具 举报
唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。
回复 使用道具 举报
在多线程里用notify的时候,一定要和wait联合起来看,单看任何一个都是没有意义的。wait和notify是配套的,也只有wait之后才会有notify,这也是是多线程之间的通信机制。就像你觉得肚子饿了,给你同事说,我们等会去吃饭,你半个小时叫我,在半个小时后,你同事叫了你,然后你去吃饭。但是这里有个不同的东西就是notify和wait都需要某个Object的锁才会有意义,也就是说这种通信必须被置于同步块中。这是对象锁的概念,也就是说线程A和B要工作都要获得同一对象的锁,不然是没有意义的。
关于你提出的问题到底唤醒谁,其实默认情况下是由JVM来决定的,你是无法控制的,但是他和线程的优先级以及谁先wait是有关系的,不过不是绝对的,因为每个JVM在不同平台上表现可能有差异,这个没法决定。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马