A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李小丰 黑马帝   /  2012-2-6 14:22  /  2919 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Sleep()和wait()的区别是什么啊?

我还是没搞太清楚,求解!

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

12 个回复

正序浏览
Sleep():是在同步中,还会持有锁
Wait():在同步中,不会持有锁。
回复 使用道具 举报
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)   {
}

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
马欢 发表于 2012-2-6 14:53
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,
wa ...

sleep会让出cpu,只是有锁的话不会让出同步锁
回复 使用道具 举报
本帖最后由 最初的理想 于 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状态和程序可以再次得到锁后继续向下运行。

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
易伟 黑马帝 2012-2-6 15:25:20
9#
{:soso_e113:}
Sleep()是睡到自然醒。
wait()是晕了,你得扎它一针。
回复 使用道具 举报
马欢 黑马帝 2012-2-6 14:53:46
8#
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,
wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,
再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源,
sleep是静态方法,是谁掉的谁去睡觉,就算是在main线程里调用了线程b的sleep方法,实际上还是main去睡觉,想让线程b去睡觉要在b的代码中掉sleep

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
wait()需要nofity()方法唤醒,sleep指睡眠一段时间,重新获得权限执行
回复 使用道具 举报
sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行.
wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者
回复 使用道具 举报
sleep故名为睡。而wait为等。睡了一会就自已会醒。而等则需要有人来通知(叫)。
回复 使用道具 举报
多线程中的线程等待问题:
sleep():可以规定等待的时间(时间单位是毫秒数),而且在等待的同时不释放执行权,即它霸占了CPU的执行权而使其在等待的同时其他的代码也不能被执行。只有规定的等待时间过后释放执行权,但仍具备CPU的执行资格。
wait():不可以规定等待的时间,在等待的同时失去了执行资格和执行权,即CPU将不会再执行此线程中的代码,只有用notify()或notifyAll()将其唤醒后才能具备执行资格才有可能再次被CPU执行(因为有执行资格但不一定具备执行权)。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
一个是睡一会自己就醒来了  一个是没人叫他一直等着

评分

参与人数 1技术分 +1 收起 理由
admin + 1 山寨

查看全部评分

回复 使用道具 举报
网上找了一个介绍很全面。
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不需要捕获异常

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马