黑马程序员技术交流社区

标题: sleep() 和 wait() 有什么区别? [打印本页]

作者: lvwenwen88    时间: 2012-1-5 11:22
标题: sleep() 和 wait() 有什么区别?
本帖最后由 lvwenwen88 于 2012-1-9 21:24 编辑

sleep() 和 wait() 有什么区别?
作者: 魏志雷    时间: 2012-1-5 11:27
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不需要捕获异常



作者: 孙海亮    时间: 2012-1-5 11:57
魏志雷 发表于 2012-1-5 11:27
1 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。
sleep是Thread的静态类方法, ...

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

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

同步代码块保证当前线程执行结束之前,另一线程不会进来,不会有线程出现线程中断,不会抛出异常,而wai,notify,notifyAll是在线程中断时才会抛出异常,所以没有必要捕获
作者: 李建平    时间: 2012-1-5 12:23
功能差不多,都用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步锁.   
还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起.


作者: 刘博    时间: 2012-1-5 12:28
毕老师说的已经很简介了,sleep()不释放系统资源,而wait()释放系统资源;
剩下的更深层的这会说了看着也迷糊,在以后的慢慢学习中会有更深刻的领悟
作者: 李晓光    时间: 2012-1-5 19:54
wait ():释放资源,释放锁
sleep():释放资源 ,不释放锁
作者: 刘小峰    时间: 2012-1-6 07:01
sleep在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响

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

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

作者: 小白    时间: 2012-1-6 17:33
 线程wait()和sleep()的区别:都是使线程暂时停止执行的方法,但它们有很大的不同,sleep是线程类Thread 的方法,它是使当前线程暂时睡眠,可以放在任何位置。而wait是Object类的方法,它是使当前线程暂时放弃对象的使用权进行等待,必须放在同步方法或同步块里。Sleep使用的时候,线程并不会放弃对象的使用权,即不会释放对象锁,所以在同步方法或同步块中使用sleep,一个线程访问时,其他的线程也是无法访问的。而wait是会释放对象锁的,就是当前线程放弃对象的使用权,让其他的线程可以访问。线程执行wait方法时,需要另一个线程调用 notify进行唤醒。而sleep只是暂时休眠一定时间,时间到了之后,自动恢复运行,不需另外的线程唤醒。
作者: zl918    时间: 2012-1-8 15:55
wait()、notify()、notifyAll()这三个方法是Object中的方法,跟锁类似。
当t1没有获取这个object时wait,其他线程释放object后叫notify,然后t1立即继续执行。

sleep()跟上面这三个不一样,是Thread中的方法,不需要等待资源被释放,sleep有一个时间传参,想让线程等待多会儿就等待多会儿,不需要其他线程唤醒。例如:
try{
      t1.sleep(1000);         //t1等待1秒后继续执行下面的内容
}catch(Exception e){}
作者: lvwenwen88    时间: 2012-1-11 22:26
zl918 发表于 2012-1-8 15:55
wait()、notify()、notifyAll()这三个方法是Object中的方法,跟锁类似。
当t1没有获取这个object时wait,其 ...

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2