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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李然 中级黑马   /  2013-12-23 05:06  /  1482 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李然 于 2013-12-23 05:22 编辑

请问各位高手,sleep和wait的区别是不是这样的,如果在一个线程同步的代码块中,用sleep方法就是线程单纯等待,同步用到的锁线程不会交出,执行权也就不会交出,别的线程在当前线程未执行玩同步代码块前不会进入同步代码块。而如果使用wait方法,线程马上就会交出线程的锁,执行权也交出,别的线程马上就可以进入同步代码块。这样理解对不对?有一个问题,就是对于notify的唤醒机制,能不能这样理解,当线程线程池中有四个线程,进入的顺序是一,二,三,四。这次个线程也通用一个锁,一,二,三线程在wait中,如果在四线程中使用notify,那么唤醒的应该是线程一,因为一是最先进入wait状态的,notify会以进入这个队列的先后顺序去唤醒,这样理解有没有什么问题?

评分

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

查看全部评分

4 个回复

倒序浏览
在同步代码块或同步函数中,若调用sleep()方法时线程会进入冻结状态,此时的线程没有释放锁;如调用wait()方法时线程也会进入冻结状态,此时线程会释放掉锁。
回复 使用道具 举报
恩,多谢
回复 使用道具 举报
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源, sleep是静态方法,是谁掉的谁去睡觉,就算是在main线程里调用了线程b的sleep方法,实际上还是main去睡觉,想让线程b去睡觉要在b的代码中掉sleepsleep(100L)是占用cpu,线程休眠100毫秒,其他进程不能再占用cpu资源,wait(100L)是进入等待池中等待,交出cpu等系统资源供其他进程使用,在这100毫秒中,该线程可以被其他线程notify,但不同的是其他在等待池中的线程不被notify不会出来,但这个线程在等待100毫秒后会自动进入就绪队列等待系统分配资源,换句话说,sleep(100)在100毫秒后肯定会运行,但wait
回复 使用道具 举报
FFF 金牌黑马 2013-12-23 09:48:40
报纸
【⑨】№①妮 发表于 2013-12-23 08:52
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,wai ...

但wait···
wait干嘛??没了???
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马