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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵庆礼 中级黑马   /  2012-6-24 23:19  /  1841 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由  赵庆礼 于 2012-6-25 10:41 编辑

怎样理解线程的等待和唤醒的问题?看了毕老师视频中讲的,还是不太明白。哪位大侠帮忙解释一下。谢谢

2 个回复

倒序浏览
当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒所有线程),线程被唤醒后会进入锁池,等待获取锁标记。

wait() 必须在synchronized 函数或者代码块里面
wait()会让已经获得synchronized 函数或者代码块控制权的Thread暂时休息,并且丧失控制权
这个时候,由于该线程丧失控制权并且进入等待,其他线程就能取得控制权,并且在适当情况下调用notifyAll()来唤醒wait()的线程。
需要注意的是,被唤醒的线程由于已经丧失了控制权,所以需要等待唤醒它的线程结束操作,从而才能重新获得控制权。
所以wait()的确是马上让当前线程丧失控制权,其他的线程可以乘虚而入。
所以wait()的使用,必须存在2个以上线程,而且必须在不同的条件下唤醒wait()中的线程。

notifyAll()并不是让当前线程马上让出控制权,而只是让其他wait()当中的线程唤醒而已,
尽管我唤醒你,可你必须还是要等我线程操作完成,并且被唤醒的线程仍需和其他醒的线程一起争夺CPU执行权。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
话说八戒和沙师弟一起在整理经卷(两个线程),然后八戒偷懒睡过去了(wait)~小沙还在那认认真真的工作着。如果没有人叫八戒的话,八戒自己是不会醒的呵~!
然后小沙一抬头,心想这不行,我一个人干到啥时候啊,于是就去把八戒摇醒~!(notify)八戒醒是醒了,却不一定立即投入到工作中去~
这是我自己反过来理解的例子,实际上。线程争cpu执行权是很积极的啊~就像一个玩具好几个小朋友玩,但是一次只能让一个人玩,有的小孩子玩着玩着睡着了,别的小朋友拿过来玩,等哪个小朋友玩腻了叫醒这个睡着的孩子时,这孩子头还有点晕,不一定马上又要玩游戏机。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 有才~~

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马