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

© 张水荣 中级黑马   /  2012-7-18 20:55  /  2013 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张水荣 于 2012-7-18 21:26 编辑

请问wait()方法与sleep()方法的区别是什么?

5 个回复

倒序浏览

这两者的施加者是有本质区别的.

sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制.

而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线 程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处 继续执行.


其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题

在java.lang.Thread类中,提供了sleep(),
而java.lang.Object类中提供了wait(), notify()和notifyAll()方法来操作线程
sleep()可以将一个线程睡眠,参数可以指定一个时间。
而wait()可以将一个线程挂起,直到超时或者该线程被唤醒。
    wait有两种形式wait()和wait(milliseconds).
sleep和wait的区别有:
  1,这两个方法来自不同的类分别是Thread和Object
  2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
  3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
    任何地方使用
   synchronized(x){
      x.notify()
     //或者wait()
   }
   4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
wait() 方法  需要在同步块中 它的调用者必须是这个同步的锁  该线程会睡眠 并且释放锁 如果参数有设置long值则休眠该时间在醒来  或者当拥有该锁的其他线程调用notify()方法在醒来   醒来以后不会马上获取cpu的执行权 也不会获得锁 而是加入等待线程池中 跟别的线程一起抢夺执行权和锁 用wait时要注意死锁的问题  sleep  休眠指定的时间 但是不释放锁   休眠和wait都可以被别的线程踢醒  被提醒的线程会抛异常
回复 使用道具 举报
1.sleep()使线程休眠一段时间,一段时间结束后,线程进入可执行状态,但并不是立即执行,只是在被

排程器调用的时候才执行。在休眠期间,并不释放所持有的“锁”;

2.wait()使线程休眠一段时间,若设置参数,时间到时,线程就自动进入可执行状态。若没有,则需要

notify()方法去调用。值得注意的是:wait()方法和notify()方法都时针对this对象的,调用wait()方法后,会释

放加在对象上的“锁”。


我理解大概就是这样的



可以参考下代码:

public class TestNotify {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

TestNotify testNotify = new TestNotify();

ThreadB b = testNotify.new ThreadB();

b.start();

System.out.println("b is start");

synchronized(b)

{

try

{

System.out.println("Waiting for b to complete");

b.wait(); // 暂时放弃对象锁,让主线程暂停,让ThreadB开始执行

}

catch(InterruptedException e)

{

e.printStackTrace();

}

System.out.println("Final Total is:"+b.total);

}

}

class ThreadB extends Thread{

int total;

public void run()

{

synchronized(this)

{

System.out.println("ThreadB is running");

for(int i=0;i<100;i++)

{

total+=i;

}

notify(); // 执行完毕,唤醒被暂停的线程

}

}

}

}

运行结果:b is start
Waiting for b to complete
ThreadB is running
Final Total is:4950
回复 使用道具 举报
wait()方法等待后不能自己唤醒,需要得到notify()提示后才能结束等待状态。
而sleep()方法可以自定义等待时间,当时间到了后,无论是否有外部唤醒,都是结束等待状态。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马