黑马程序员技术交流社区
标题:
sleep()和wait()的区别?
[打印本页]
作者:
16463535
时间:
2013-4-13 15:01
标题:
sleep()和wait()的区别?
本帖最后由 16463535 于 2013-4-14 00:34 编辑
sleep()和wait()的区别?有些模糊。请详解
作者:
殇_心。
时间:
2013-4-13 15:06
1、这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。
sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。
3、使用范围:wait只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
synchronized(x){
wait()
}
4、sleep必须捕获异常,而wait不需要捕获异常
作者:
huima
时间:
2013-4-13 15:39
区别如下:
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) {}
希望你能明白!!!
作者:
wlt
时间:
2013-4-13 16:42
sleep和wait都是使线程暂时停止执行的方法
,但它们有很大的不同,sleep是线程类Thread 的方法,
它是使当前线程暂时睡眠,可以放在任何位置。
而wait是Object类的方法,它是使当前线程暂时放弃对象的使用权进行等待,
必须放在同步方法或同步块里。
Sleep使用的时候,线程并不会放弃对象的使用权,即不会释放对象锁,所以在同步方法或同步块中使用sleep,一个线程访问时,其他的线程也是无法访问的。
而wait是会释放对象锁的,就是当前线程放弃对象的使用权,让其他的线程可以访问。
线程执行wait方法时,需要另一个线程调用notify进行唤醒。
而sleep只是暂时休眠一定时间,时间到了之后,自动恢复运行,不需另外的线程唤醒。
作者:
love_java
时间:
2013-4-13 17:25
sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制. 而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线 程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处 继续执行.
作者:
①人←①城市
时间:
2013-4-13 18:38
举个java.util.Timer的例子来说明。
private void mainLoop() {
while (true) {
....
synchronized(queue) {
.....
if (!taskFired) // Task hasn't yet fired; wait
queue.wait(executionTime - currentTime);
}
}
在这里为什么要使用queue.wait(),而不是Thread.sleep(), 是因为暂时放弃queue的对象锁,可以让允许其它的线程执行一些同步操作。如:
private void sched(TimerTask task, long time, long period) {
synchronized(queue) {
...
queue.add(task);
}
}
使用queue.wait(long)的前提条件是sched()动作执行的时间很短,否则如果很长,那么queue.wait()不能够按时醒来。
作者:
黑马李强
时间:
2013-4-13 19:36
sleep()方法是使线程停止运行一段时间,待sleep时间满之后,也不一定会立即执行、
而wait()是是线程进入等待状态,直到另外的线程执行到notify()方法时,才会对wait()方法进行唤醒。
作者:
庞立森
时间:
2013-4-13 19:59
简单来讲
不同点:
1.sleep是线程类Thread 的方法,在使用sleep()方法的时候,不会自动释放对象锁,也就是说其他的线程无法进入,等到sleep()方法内的时间到时,他就会就继续去执行,
2.wait是Object类的方法,在使用wait()方法时,自动的释放对象锁,等某个线程遇到wait()时,就会处于休眠状态,其他的线程还可以继续执行,谁被wait()后必须用notify方法去唤醒他,他不会自动的醒来,
作者:
杨永胜
时间:
2013-4-13 20:26
建立看一下张老师的面试宝典,把基础那部分看完基础就没问题了
作者:
lyg2013
时间:
2013-4-13 21:29
sleep()方法是Thread类的方法,因此它不能改变对象的机锁。所以当在一个Synchronized方法中调用sleep()时,线程虽然休眠了,但是对象的机锁没有被释放,其他线程仍然无法访问这个对象。而wait()方法则会在线程休眠的同时释放掉机锁,其他线程可以访问该对象。
作者:
zhuiyi0819
时间:
2013-4-14 00:24
sleep():只有带参数的,不释放锁对象。
wait():可以不带参数,释放锁对象。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2