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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗家辉 中级黑马   /  2013-4-13 18:50  /  2590 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗家辉 于 2013-4-14 14:58 编辑

wait()就是导致当前线程等待,真到其他线程调用notify()和notifAll()方法把他叫醒。
那notify()就是叫醒当前线程啊,那假如同步监视器上不只一个线程在等待呢,那notify()会叫醒那个线程啊??

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

11 个回复

正序浏览
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
罗家辉 发表于 2013-4-13 19:39
上面有的说是不确定喔,我在疯狂java讲义上查了,它也说选择是任意性,那究竟是第一个等待的会被叫醒,还 ...

这个具体是不是任意的,得找java工程师了,根据视频所得是,有一个等待线程池,notify唤醒的是第一个进入的,你可以理解成这样,一个圆筒,一端是进一端是出,第一个进去的必然第一个出来,notify将离出口最近的一个拉出来,notifyAll 就是将筒里的东西全部都踢出去。不知道这样说你能清楚不。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
是叫醒线程池中的第一个等待的线程。
回复 使用道具 举报
wait导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或被其他线程中断。wait只能由持有对像锁的线程来调用。
notify唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程(随机)。直到当前的线程放弃此对象上的锁,才能继续执行被唤醒的线程。同Wait方法一样,notify只能由持有对像锁的线程来调用.notifyall也一样,不同的是notifyall会唤配所有在此对象锁上等待的线程。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
。。。。。。 发表于 2013-4-13 19:12
第一个等待的会被醒,而notifyAll()会叫醒所有等待的线程,从1.5开始出现了新的接口Lock,Lock 实现提供了 ...

上面有的说是不确定喔,我在疯狂java讲义上查了,它也说选择是任意性,那究竟是第一个等待的会被叫醒,还是任意的???
回复 使用道具 举报
notify:唤醒同一对象监视器中调用wait的第一个线程。
回复 使用道具 举报
第一个等待的会被醒,而notifyAll()会叫醒所有等待的线程,从1.5开始出现了新的接口Lock,Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象,Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。 你可以查查API文档了解,后面的视频也会提到这方面的知识,加油哟!

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
顺便说一下notifyall,虽然是对每个wait的对象都调用一次notify,但是这个还是有顺序的,每个对象都保存这一个等待对象链,调用的顺序就是这个链的顺序。其实启动等待对象链中各个线程的也是一个线程,在具体应用的时候,需要注意一下。
回复 使用道具 举报
就是按等待的先后顺序   谁先等就先唤醒睡
回复 使用道具 举报
不确定,所以会造成都等待的情况,所以用notifyAll()唤醒所有等待的线程,再一种就是1.5后的新特性lock锁,condition能指明唤醒哪个线程
回复 使用道具 举报
会叫醒第一个开始等待的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马