黑马程序员技术交流社区

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

作者: wsc1988126    时间: 2012-10-22 19:47
标题: sleep() 和wait() 有什么区别?
新手小白求问?
作者: 于连林    时间: 2012-10-22 19:51
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。


作者: 鲁中需    时间: 2012-10-22 20:01
1、sleep是Thread的静态类方法, 和wait来自Object类
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait
只能在同步控制方法或者同步控制块里面使用,而sleep可以在
     任何地方使用(使用范围)
    synchronized(x){
       x.notify()
      //或者wait()
    }
4、sleep必须捕获异常,而wait
不需要捕获异常
作者: 刘学宾    时间: 2012-10-22 20:04
sleep来自Thread类,wait来自Object类。
sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。最主要区别是sleep方法没有释放锁,而wait方法释放了锁,
使得其他线程可以使用同步控制块或者方法。




作者: 李铁    时间: 2012-10-22 20:32
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的锁;只有针对此对象发出notify方法(或notifyAll)后该线程将等到重新获得对监视器的所有权后才能继续执行。

作者: 焦志鹏    时间: 2012-10-22 20:49
简单说,sleep(time)就是睡,睡一会(睡的时间是time)就自己醒了;

wait()是等,得有人给它一个信号才能缓过劲来,这个信号就是notify()
作者: 唐进    时间: 2012-10-22 20:55
sleep和wait的不同体现在同步线程中,用sleep方法,线程不会释放锁,而用wait方法时,线程会释放锁,让其他线程可以进入
作者: 王畅游    时间: 2012-10-22 21:19
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非醒来的线程具有更高的优先级或者正在运行的线程因为其它原因而阻塞。而wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。 当调用wait()后,线程会释放掉它所占有的锁标志,从而使线程所在对象中的其它synchronized数据可被别的线程使用。简单一点就理解为sleep由线程自动唤醒,wait必须显示用代码唤醒。
作者: 秦松    时间: 2012-10-22 21:26
功能差不都,都用来进行线程控制.他们最大的本质区别是:sleep()不释放同步锁,wait()释放同步锁

还有用法上的不同是:sleep(milliseconds)可以应时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()用notify()直接唤醒
作者: 聆听    时间: 2012-10-28 14:22
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。
调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。




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