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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙新强 中级黑马   /  2012-6-27 22:08  /  4403 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程中sleep与wait的区别是什么啊 麻烦大家指教一下 谢谢 最好举一个例子

7 个回复

倒序浏览
wait():释放资源,释放锁
sleep():释放资源,不释放锁
回复 使用道具 举报
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁, wait().会释放锁 。
回复 使用道具 举报
1 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。
sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。

2 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。

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

4 sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
回复 使用道具 举报
sleep是让当前正在执行的线程休眠一段时间。时间到后获得执行资格。

wait是线程调用的,当调用的时候线程将会等待。可以通过notify或者notifyall唤醒。当线程被唤醒的时候就会获得执行资格。
回复 使用道具 举报
本帖最后由 rslheima 于 2012-6-27 23:10 编辑

这里涉及对象锁的概念:
同步时需要Synchronized防止冲突,而一旦同步就要锁定对象,(获取对象锁)
其他使用该对象锁的线程,都只能排队,等到上一程序执行完成。
wait()  
sleep()
属于顶层Object
属于Thread
调用时可解除锁定(把对象锁让给其他线程)
调用时不会解除锁定
可在执行wait()期间调用线程对象中的其他同步方法
期间不能调用线程对象中的其他同步方法
wait()执行之后收回对象锁
(1)waitX):X毫秒之后唤醒
(2)通过notify()或notifyAll()唤醒
sleepY):Y毫秒后唤醒
waitnotifynotifyAll只能在同步控制方法或者同步控制块里面使用
sleep()可以在任何地方使用

回复 使用道具 举报
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源,
sleep是静态方法,是谁掉的谁去睡觉,就算是在main线程里调用了线程b的sleep方法,实际上还是main去睡觉,想让线程b去睡觉要在b的代码中掉sleep

sleep(100L)是占用cpu,线程休眠100毫秒,其他进程不能再占用cpu资源,wait(100L)是进入等待池中等待,交出cpu等系统资源供其他进程使用,在这100毫秒中,该线程可以被其他线程notify,但不同的是其他在等待池中的线程不被notify不会出来,但这个线程在等待100毫秒后会自动进入就绪队列等待系统分配资源,换句话说,sleep(100)在100毫秒后肯定会运行,但wait在100毫秒后还有等待os调用分配资源,所以wait100的停止运行时间是不确定的,但至少是100毫秒。

点评

警告第四次,这次是百度知道?  发表于 2012-6-28 16:35
回复 使用道具 举报
1,sleep()方法必须指定时间,wait()可以指定时间也可以不指定。
2,wait()必须定义在同步中,sleep不一定。
3,在同步中的wait()、sleep()对于执行权和锁的处理不同。
        sleep()释放执行权,但是不释放锁。
        wait()释放执行权,释放锁。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马