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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 16463535 中级黑马   /  2013-4-13 15:01  /  2753 人查看  /  10 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 16463535 于 2013-4-14 00:34 编辑

sleep()和wait()的区别?有些模糊。请详解

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 新人加油

查看全部评分

10 个回复

倒序浏览
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不需要捕获异常

评分

参与人数 1技术分 +3 收起 理由
滔哥 + 3

查看全部评分

回复 使用道具 举报
区别如下:
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技术分 +3 收起 理由
滔哥 + 3

查看全部评分

回复 使用道具 举报
sleep和wait都是使线程暂时停止执行的方法
,但它们有很大的不同,sleep是线程类Thread 的方法,
它是使当前线程暂时睡眠,可以放在任何位置。
而wait是Object类的方法,它是使当前线程暂时放弃对象的使用权进行等待,
必须放在同步方法或同步块里。
Sleep使用的时候,线程并不会放弃对象的使用权,即不会释放对象锁,所以在同步方法或同步块中使用sleep,一个线程访问时,其他的线程也是无法访问的。
而wait是会释放对象锁的,就是当前线程放弃对象的使用权,让其他的线程可以访问。
线程执行wait方法时,需要另一个线程调用notify进行唤醒。
而sleep只是暂时休眠一定时间,时间到了之后,自动恢复运行,不需另外的线程唤醒。  

评分

参与人数 1技术分 +3 收起 理由
滔哥 + 3

查看全部评分

回复 使用道具 举报
sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制.       而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线 程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处 继续执行.

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2

查看全部评分

回复 使用道具 举报
举个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()不能够按时醒来。

评分

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

查看全部评分

回复 使用道具 举报
sleep()方法是使线程停止运行一段时间,待sleep时间满之后,也不一定会立即执行、
而wait()是是线程进入等待状态,直到另外的线程执行到notify()方法时,才会对wait()方法进行唤醒。
回复 使用道具 举报
简单来讲
     不同点:
1.sleep是线程类Thread 的方法,在使用sleep()方法的时候,不会自动释放对象锁,也就是说其他的线程无法进入,等到sleep()方法内的时间到时,他就会就继续去执行,
2.wait是Object类的方法,在使用wait()方法时,自动的释放对象锁,等某个线程遇到wait()时,就会处于休眠状态,其他的线程还可以继续执行,谁被wait()后必须用notify方法去唤醒他,他不会自动的醒来,

  

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2

查看全部评分

回复 使用道具 举报
建立看一下张老师的面试宝典,把基础那部分看完基础就没问题了
回复 使用道具 举报
sleep()方法是Thread类的方法,因此它不能改变对象的机锁。所以当在一个Synchronized方法中调用sleep()时,线程虽然休眠了,但是对象的机锁没有被释放,其他线程仍然无法访问这个对象。而wait()方法则会在线程休眠的同时释放掉机锁,其他线程可以访问该对象。
回复 使用道具 举报
sleep():只有带参数的,不释放锁对象。
wait():可以不带参数,释放锁对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马