黑马程序员技术交流社区
标题:
Sleep()和wait()有什么区别?
[打印本页]
作者:
周君洲
时间:
2011-9-22 17:56
标题:
Sleep()和wait()有什么区别?
在线程中这2个方法主要区别是什么呢?
作者:
匿名
时间:
2011-9-22 19:34
sleep()是Thread静态方法,只能在当前线程被调用。主要用来让当前线程睡眠,睡眠过程中紧抱着锁对象不放,这样的话线程也不能继续下去,只有当睡眠时间到了该进程才能继续下去。
wait()方法是Object类方法。也是让线程睡眠,但与sleep方法最大的不同是,睡眠过程中会释放锁对象,这样的话其他线程可以锁住该对象。如果wait住了话,可以通过notfiy方法来叫醒该进程。
作者:
匿名
时间:
2011-9-22 19:45
顶楼上:lol
作者:
匿名
时间:
2011-9-22 21:28
sleep()是睡觉睡到自然醒
wait()是睡觉睡到老妈喊你才醒
作者:
匿名
时间:
2011-9-22 21:47
标题:
回复 沙发 的帖子
我来补充下
共同点:
1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
2. wait()和sleep()都可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出InterruptedException。
如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep /join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException。
不同点:
1. Thread类的方法:sleep(),yield()等
Object的方法:wait()和notify()等
2. 每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。
sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
4. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
作者:
匿名
时间:
2011-9-25 07:22
毕老师的视频中讲解过的.:
sleep();在多线程中称为冻结状态, 线程在调用sleep方法后,进入休眠状态,此时线程并不失去已获得的
锁旗标,当休眠时间到 ,线程从冻结状态恢复为运行状态..
而wait();也是冻结状态, 和sleep不同的是, wait没有休眠时间 ,, 而是直到被唤醒为止, 与其对应
使用的是notify(); , 即:唤醒...
作者:
匿名
时间:
2011-9-25 10:02
标题:
回复 楼主 的帖子
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2