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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马胡林 黑马帝   /  2012-3-7 13:50  /  3027 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

sleep() 和 wait() 有什么区别?

8 个回复

正序浏览
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方法才会重新激活调用者

评分

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

查看全部评分

回复 使用道具 举报
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是等待资源 线程处于已激活状态 直到有资源分配给该线程时 该线程继续运行 可以用notify()唤醒
wait().会释放锁

举个很简单的例子给楼主:

两个人(A,B)都在(等待)看电影

A(sleep) 等待的时候不会把座位让给别人

B(wait) 也在等待但是它可以把座位让给别人自己站着

也就是说A等待的时候不给把资源交给别人..

而B等待的时候可以把资源交给别人

评分

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

查看全部评分

回复 使用道具 举报
sleep方法主要是控制线程,是Thread类的方法,表示让一个线程进入睡眠状态,期间并不释放所持有的锁,但是经过一定时间自动醒来后进入可运行状态而不是立即运行,而且sleep方法是一个静态方法,可以使用在任何地方
wait方法则主要是线程间通信,是Object类的方法,wait后释放持有的锁,让替他线程来操作同步代码块或方法,wait方法要和notify方法等使用在同步方法或代码块中。
虽然两个都可以让线程停止,但是作用范围和效果是不同的

评分

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

查看全部评分

回复 使用道具 举报
sleep 是睡眠  就像人睡觉一样  到一定时间自动醒来运行。。。wait方法就是睡着了如果不叫醒他永远不会醒来 必须调用notify来叫醒  大概解释就是这样 。想听详细的解释密我
回复 使用道具 举报
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不需要捕获异常
回复 使用道具 举报
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
回复 使用道具 举报
wait()是用来锁定一个对象的,它以后的代码永远不会执行,也不会自动解锁,必须在另一个线程中调用 这个对象 的notify()方法。调用wait()方法时必须锁定对象!

sleep()方法使得当前线程休眠(暂时停止执行XX毫秒)。别的线程是不可以访问该锁定的对象。

wait() sleep() 都会抛出异常 throw InterruptedException

评分

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

查看全部评分

回复 使用道具 举报
wait是等待资源 线程处于已激活状态 直到有资源分配给该线程时 该线程继续运行 可以用notify()唤醒。
sleep的线程是非激活状态 一般会指定参数是多少时间 时间到了又会处于自动激活状态 更加常用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马