黑马程序员技术交流社区

标题: 线程中wait()和notify()的问题 [打印本页]

作者: 罗家辉    时间: 2013-4-13 18:50
标题: 线程中wait()和notify()的问题
本帖最后由 罗家辉 于 2013-4-14 14:58 编辑

wait()就是导致当前线程等待,真到其他线程调用notify()和notifAll()方法把他叫醒。
那notify()就是叫醒当前线程啊,那假如同步监视器上不只一个线程在等待呢,那notify()会叫醒那个线程啊??
作者: 沈浩    时间: 2013-4-13 19:03
会叫醒第一个开始等待的
作者: ld5128702    时间: 2013-4-13 19:06
不确定,所以会造成都等待的情况,所以用notifyAll()唤醒所有等待的线程,再一种就是1.5后的新特性lock锁,condition能指明唤醒哪个线程
作者: 沈浩    时间: 2013-4-13 19:08
就是按等待的先后顺序   谁先等就先唤醒睡
作者: 沈浩    时间: 2013-4-13 19:10
顺便说一下notifyall,虽然是对每个wait的对象都调用一次notify,但是这个还是有顺序的,每个对象都保存这一个等待对象链,调用的顺序就是这个链的顺序。其实启动等待对象链中各个线程的也是一个线程,在具体应用的时候,需要注意一下。
作者: 。。。。。。    时间: 2013-4-13 19:12
第一个等待的会被醒,而notifyAll()会叫醒所有等待的线程,从1.5开始出现了新的接口Lock,Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象,Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。 你可以查查API文档了解,后面的视频也会提到这方面的知识,加油哟!
作者: 本人已死    时间: 2013-4-13 19:23
notify:唤醒同一对象监视器中调用wait的第一个线程。
作者: 罗家辉    时间: 2013-4-13 19:39
。。。。。。 发表于 2013-4-13 19:12
第一个等待的会被醒,而notifyAll()会叫醒所有等待的线程,从1.5开始出现了新的接口Lock,Lock 实现提供了 ...

上面有的说是不确定喔,我在疯狂java讲义上查了,它也说选择是任意性,那究竟是第一个等待的会被叫醒,还是任意的???
作者: ①人←①城市    时间: 2013-4-13 20:48
wait导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或被其他线程中断。wait只能由持有对像锁的线程来调用。
notify唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程(随机)。直到当前的线程放弃此对象上的锁,才能继续执行被唤醒的线程。同Wait方法一样,notify只能由持有对像锁的线程来调用.notifyall也一样,不同的是notifyall会唤配所有在此对象锁上等待的线程。
作者: 崔宝东    时间: 2013-4-13 21:16
是叫醒线程池中的第一个等待的线程。
作者: 、__WSD吴少东    时间: 2013-4-13 21:59
罗家辉 发表于 2013-4-13 19:39
上面有的说是不确定喔,我在疯狂java讲义上查了,它也说选择是任意性,那究竟是第一个等待的会被叫醒,还 ...

这个具体是不是任意的,得找java工程师了,根据视频所得是,有一个等待线程池,notify唤醒的是第一个进入的,你可以理解成这样,一个圆筒,一端是进一端是出,第一个进去的必然第一个出来,notify将离出口最近的一个拉出来,notifyAll 就是将筒里的东西全部都踢出去。不知道这样说你能清楚不。
作者: 黄玉昆    时间: 2013-4-14 14:17
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢




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