黑马程序员技术交流社区

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

作者: 黑马胡林    时间: 2012-3-7 13:50
标题: 线程中sleep(),和wait() 有什么区别?
sleep() 和 wait() 有什么区别?
作者: 泮和顺    时间: 2012-3-7 14:11
wait是等待资源 线程处于已激活状态 直到有资源分配给该线程时 该线程继续运行 可以用notify()唤醒。
sleep的线程是非激活状态 一般会指定参数是多少时间 时间到了又会处于自动激活状态 更加常用。
作者: 赵孟恩    时间: 2012-3-7 14:40
wait()是用来锁定一个对象的,它以后的代码永远不会执行,也不会自动解锁,必须在另一个线程中调用 这个对象 的notify()方法。调用wait()方法时必须锁定对象!

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

wait() sleep() 都会抛出异常 throw InterruptedException
作者: 程小龙    时间: 2012-3-7 15:32
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
作者: 逄焕玮    时间: 2012-3-7 16: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-3-7 19:15
sleep 是睡眠  就像人睡觉一样  到一定时间自动醒来运行。。。wait方法就是睡着了如果不叫醒他永远不会醒来 必须调用notify来叫醒  大概解释就是这样 。想听详细的解释密我
作者: 吴璞玉    时间: 2012-3-7 20:45
sleep方法主要是控制线程,是Thread类的方法,表示让一个线程进入睡眠状态,期间并不释放所持有的锁,但是经过一定时间自动醒来后进入可运行状态而不是立即运行,而且sleep方法是一个静态方法,可以使用在任何地方
wait方法则主要是线程间通信,是Object类的方法,wait后释放持有的锁,让替他线程来操作同步代码块或方法,wait方法要和notify方法等使用在同步方法或代码块中。
虽然两个都可以让线程停止,但是作用范围和效果是不同的
作者: 陈斌    时间: 2012-3-7 22:03
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是等待资源 线程处于已激活状态 直到有资源分配给该线程时 该线程继续运行 可以用notify()唤醒
wait().会释放锁

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

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

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

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

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

而B等待的时候可以把资源交给别人
作者: 李会启    时间: 2012-3-8 12:22
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方法才会重新激活调用者





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