黑马程序员技术交流社区

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

作者: 松鼠    时间: 2013-12-15 19:31
标题: sleep()和wait()有什么区别?
他们到底有什么区别?   我看视频看的很晕
作者: Faner    时间: 2013-12-15 19:32
sleep ()  不需要唤醒         wait() 需要唤醒
作者: 城市儒侠    时间: 2013-12-15 19:38
我的个人理解:

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
作者: 豆晨阳    时间: 2013-12-15 20:41
1、这两个方法来自不同的类分别是Thread和Object
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
 任何地方使用(使用范围)
  synchronized(x){
  x.notify()
  //或者wait()
  }
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
作者: 75100313    时间: 2013-12-15 22:00
{:soso_e179:}学习了
作者: 雨的印记yp    时间: 2013-12-16 01:08
相同:都进入冻结状态,放弃执行资格,cpu会去执行其他线程。
不同:sleep()等时间到自己会醒来,线程继续运行;wait()后必须要有notify()方法唤醒。更重要的是在同步中,sleep()不会放弃锁,而wait()会放弃锁。
作者: Knife    时间: 2013-12-16 01:34
sleep是定时间,过了定的时间自己会继续运行,而wait()是要有方法唤醒后才能继续运行
作者: 恩恩    时间: 2013-12-16 03:20
要想知道是怎么回事你就需要了解这个是干什么的,这两个方法的作用都是让当前的线程放弃CPU资源,让CPU去执行其他的线程,这样可以体现一个分时的平均性,在某种程度上说是合理的利用CPU资源。但是这两个方法有一定的不同,就是sleep是有一个时间设定,就是当前这个线程休息多长时间或者睡眠多长时间,等时间一到这个线程会自动启动,如果当前没有线程在运行,那么很自然的这个线程被运行,不过可能性很小。然而wait这个方法是被停用了,你必须要有一种唤醒的机制来叫醒它,否则他就永远睡眠。
作者: zeratel3000    时间: 2013-12-16 10:48
楼上回答的都很全面了但是我想提醒一下,wait也是可以规定时间的,wait有一种是wait(long timeout)还有一种是wait(long timeout,int nanos)
作者: swqsljy    时间: 2013-12-17 10:29
    Thread.sleep ()使当前线程在指定的时间处于“非运行”状态。线程一直持有对象的监视器。如果另一线程调用了 interrupt ()方法,它将唤醒那个“睡眠的”线程。
    object.wait ()使当前线程处于“不可运行”状态,和 sleep ()不同的是 wait 是 object 的方法而不是 thread。调用 object.wait ()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用 object.notify (),这样将唤醒原来等待中的线程,然后释放该锁。基本上 wait ()/notify ()与 sleep ()/interrupt ()类似,只是前者需要获取对象锁。





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