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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张涛的狂怒 于 2014-8-6 10:02 编辑

Sleep ()、suspend ()和 wait ()之间有什么区别?
都在什么时候使用?怎么区分什么时候该用哪个?

9 个回复

倒序浏览
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。但由于suspend()方法很容易引起死锁问题,已经不推荐使用了。

评分

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

查看全部评分

回复 使用道具 举报
到处玩的 发表于 2014-8-6 00:24
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保 ...

也就是说sleep和wait的区别在与锁是否释放,和自动苏醒与人工唤醒。那么什么时候用呢?怎么区分?
回复 使用道具 举报
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源
wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源
回复 使用道具 举报
区别:sleep必须指定时间,并且起来之后不会释放锁。wait比较厉害,它既可以指定时间,也可以不指定时间,起来后释放锁,让后面的线程都用不了锁了,suspend()是使线程进入挂起状态。
什么时候用:sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制.
还有一个sieep继承的是Thread类,wait继承的是Object类

而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但这个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处继续执行.

评分

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

查看全部评分

回复 使用道具 举报
到处玩的 来自手机 中级黑马 2014-8-6 07:50:54
地板
草鱼狂飙 发表于 2014-8-6 05:53
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源
wait ...

wait()用notify()也能唤醒
回复 使用道具 举报
看了 明白了
回复 使用道具 举报
Object-->wait( )
释放资源,释放锁
o.wait( );程序从运行状态变成等待状态
唤醒:notify( );notifyall( )
Thread-->sleep( )
释放资源不释放锁
Thread.sleep( );
程序从运行状态变为阻塞状态(具备执行资格,没有执行权)
唤醒:sleep( )结束

**wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,
    而sleep可以在任何地方使用

线程状态_2345看图王.jpg (933.43 KB, 下载次数: 52)

线程状态_2345看图王.jpg

评分

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

查看全部评分

回复 使用道具 举报
Bermuda  发表于 2014-8-6 08:26
Object-->wait( )
释放资源,释放锁
o.wait( );程序从运行状态变成等待状态

非常感谢
回复 使用道具 举报
rolling-stone 发表于 2014-8-6 07:49
区别:sleep必须指定时间,并且起来之后不会释放锁。wait比较厉害,它既可以指定时间,也可以不指定时间,起 ...

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