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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lvwenwen88 黑马帝   /  2012-1-5 11:22  /  5264 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 lvwenwen88 于 2012-1-9 21:24 编辑

sleep() 和 wait() 有什么区别?

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

13 个回复

倒序浏览
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不需要捕获异常


评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
魏志雷 发表于 2012-1-5 11:27
1 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。
sleep是Thread的静态类方法, ...

我不同意楼上的第四条,wait,notify和notifyAll的使用都会抛出 Exception异常,  
wait会抛出 InterruptedException 异常,而notify和notifyAll会抛出IllegalMonitorStateException异常。既然他们都抛出异常,那为什么不需要捕获呢?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行。wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者。
回复 使用道具 举报
孙海亮 发表于 2012-1-5 11:57
我不同意楼上的第四条,wait,notify和notifyAll的使用都会抛出 Exception异常,  
wait会抛出 Interrupt ...

同步代码块保证当前线程执行结束之前,另一线程不会进来,不会有线程出现线程中断,不会抛出异常,而wai,notify,notifyAll是在线程中断时才会抛出异常,所以没有必要捕获

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
功能差不多,都用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步锁.   
还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起.

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
刘博 黑马帝 2012-1-5 12:28:31
7#
毕老师说的已经很简介了,sleep()不释放系统资源,而wait()释放系统资源;
剩下的更深层的这会说了看着也迷糊,在以后的慢慢学习中会有更深刻的领悟
回复 使用道具 举报
wait ():释放资源,释放锁
sleep():释放资源 ,不释放锁
回复 使用道具 举报
sleep在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响

wait在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。

还有就是sleep属于Thread类而wait属于object类

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
小白 黑马帝 2012-1-6 17:33:23
10#
 线程wait()和sleep()的区别:都是使线程暂时停止执行的方法,但它们有很大的不同,sleep是线程类Thread 的方法,它是使当前线程暂时睡眠,可以放在任何位置。而wait是Object类的方法,它是使当前线程暂时放弃对象的使用权进行等待,必须放在同步方法或同步块里。Sleep使用的时候,线程并不会放弃对象的使用权,即不会释放对象锁,所以在同步方法或同步块中使用sleep,一个线程访问时,其他的线程也是无法访问的。而wait是会释放对象锁的,就是当前线程放弃对象的使用权,让其他的线程可以访问。线程执行wait方法时,需要另一个线程调用 notify进行唤醒。而sleep只是暂时休眠一定时间,时间到了之后,自动恢复运行,不需另外的线程唤醒。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
zl918 黑马帝 2012-1-8 15:55:24
11#
wait()、notify()、notifyAll()这三个方法是Object中的方法,跟锁类似。
当t1没有获取这个object时wait,其他线程释放object后叫notify,然后t1立即继续执行。

sleep()跟上面这三个不一样,是Thread中的方法,不需要等待资源被释放,sleep有一个时间传参,想让线程等待多会儿就等待多会儿,不需要其他线程唤醒。例如:
try{
      t1.sleep(1000);         //t1等待1秒后继续执行下面的内容
}catch(Exception e){}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
zl918 发表于 2012-1-8 15:55
wait()、notify()、notifyAll()这三个方法是Object中的方法,跟锁类似。
当t1没有获取这个object时wait,其 ...

谢谢,学习学习
回复 使用道具 举报
曾辉 黑马帝 2012-1-12 13:53:22
13#
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)"醒来"的线程具有更高的优先级 (b)正在运行的线程因为其它原因而阻塞。wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

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