黑马程序员技术交流社区

标题: Sleep()和wait()的区别是什么啊? [打印本页]

作者: 李小丰    时间: 2012-2-6 14:22
标题: Sleep()和wait()的区别是什么啊?
Sleep()和wait()的区别是什么啊?

我还是没搞太清楚,求解!
作者: 章春晓    时间: 2012-2-6 14:27
网上找了一个介绍很全面。
1、这两个方法来自不同的类分别是Thread和Object
sleep是Thread对象里面的方法;
wait是Object对象里面的方法;

2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
当一个synchorized成员sleep的时候并不会释放掉synchorized;
但是当一个synchorized成员wait的时候是会释放掉synchorized的;

3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
synchronized(x){
  x.notify()
  //或者wait()
}

4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

作者: 衣服    时间: 2012-2-6 14:38
一个是睡一会自己就醒来了  一个是没人叫他一直等着
作者: 余海龙    时间: 2012-2-6 14:43
多线程中的线程等待问题:
sleep():可以规定等待的时间(时间单位是毫秒数),而且在等待的同时不释放执行权,即它霸占了CPU的执行权而使其在等待的同时其他的代码也不能被执行。只有规定的等待时间过后释放执行权,但仍具备CPU的执行资格。
wait():不可以规定等待的时间,在等待的同时失去了执行资格和执行权,即CPU将不会再执行此线程中的代码,只有用notify()或notifyAll()将其唤醒后才能具备执行资格才有可能再次被CPU执行(因为有执行资格但不一定具备执行权)。

作者: 成果    时间: 2012-2-6 14:45
sleep故名为睡。而wait为等。睡了一会就自已会醒。而等则需要有人来通知(叫)。
作者: 任奇    时间: 2012-2-6 14:47
sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行.
wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者
作者: 李泽霖    时间: 2012-2-6 14:48
wait()需要nofity()方法唤醒,sleep指睡眠一段时间,重新获得权限执行
作者: 马欢    时间: 2012-2-6 14:53
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,
wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,
再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源,
sleep是静态方法,是谁掉的谁去睡觉,就算是在main线程里调用了线程b的sleep方法,实际上还是main去睡觉,想让线程b去睡觉要在b的代码中掉sleep


作者: 易伟    时间: 2012-2-6 15:25
{:soso_e113:}
Sleep()是睡到自然醒。
wait()是晕了,你得扎它一针。
作者: 最初的理想    时间: 2012-2-6 16:24
本帖最后由 最初的理想 于 2012-2-6 16:27 编辑

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果),调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。
作者: 最初的理想    时间: 2012-2-6 16:30
马欢 发表于 2012-2-6 14:53
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,
wa ...

sleep会让出cpu,只是有锁的话不会让出同步锁
作者: 彭沛东    时间: 2012-2-6 16:54
sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行,例如:

try{
      System.out.println( "I 'm   going   to   bed ");
      Thread.sleep(1000);
      System.out.println( "I   wake   up ");
}
catch(IntrruptedException   e)   {
}


wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者,例如:


//Thread   1

try{
      obj.wait();//suspend   thread   until   obj.notify()   is   called
}
catch(InterrputedException   e)   {
}
作者: 【专】【属】    时间: 2012-2-7 20:06
Sleep():是在同步中,还会持有锁
Wait():在同步中,不会持有锁。




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