黑马程序员技术交流社区
标题:
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