黑马程序员技术交流社区

标题: 请教sleep() 和 wait() 有什么具体区别? [打印本页]

作者: Kevin123    时间: 2012-12-10 15:34
标题: 请教sleep() 和 wait() 有什么具体区别?
本帖最后由 白良锦 于 2012-12-13 13:54 编辑

看基础视频多线程时老师讲到过sleep 和wait,请问sleep() wait()应用中 有什么具体区别?
作者: 高会仁    时间: 2012-12-10 15:49
本帖最后由 高会仁 于 2012-12-10 15:52 编辑

1、这两个方法来自不同的类,sleep来自Thread类,和wait来自Object类。
    sleep是Thread的静态类方法,谁调用的谁去睡觉
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
    任何地方使用
   synchronized(x){
      x.notify()
     //或者wait()
   }

作者: super_Xiong    时间: 2012-12-10 15:57
sleep()是让线程暂定一下,在指定的时间后自动开启,
wait()暂停后需要用notify()方法唤醒,否则不继续
作者: 快乐之恋    时间: 2012-12-10 16:31
区别一:

sleep是Thread类的方法,是线程用来 控制自身流程的,比如有一个要报时的线程,每一秒中打印出一个时间,那么我就需要在print方法前面加上一个sleep让自己每隔一秒执行一次。就像个闹钟一样。

wait是Object类的方法,用来线程间的通信,这个方法会使当前拥有该对象锁的进程等待知道其他线程调用notify方法时再醒来,不过你也可以给他指定一个时间,自动醒来。这个方法主要是用走不同线程之间的调度的。

  

   区别二 :

关于锁的释放 ,在这里假设大家已经知道了锁的概念及其意义。调用sleep方法不会释放锁(自己的感觉是sleep方法本来就是和锁没有关系的,因为他是一个线程用于管理自己的方法,不涉及线程通信)
区别三:

使用区域  

由于wait函数的特殊意义,所以他是应该放在同步语句块中的,这样才有意义    。
   注意:两个方法都需要抛出异常

作者: 焦健    时间: 2012-12-10 20:51
sleep()可以传入一个时间参数,可以控制时间,wait()无法控制睡眠时间,只能使用notify()进行唤醒。
作者: 小洋人最happy    时间: 2012-12-10 21:00
简单说一下,我觉得挺好理解的。
wait():可以加时间也可以不加时间,释放执行权,也释放锁
sleep():必须加时间,释放执行权,但是不释放锁  

明白吗?
作者: 孙辉辉    时间: 2012-12-12 11:48
sleep()睡眠一段时间后自动醒来
而wait()则是等待,直到有线程通知(notify())唤醒他才会重新工作
举个很简单的例子:
sleep:好比你睡觉,睡到第二天早上闹钟响后你起床继续一天的形成,只和时间有关系。
wait()则是你越好和朋友在哪集合然后一起玩,到了约定的时间你到达而你朋友没有到达,那么你就要等到你朋友到来(notify()唤醒),虽然你们约定的时间已经到了
作者: Kevin123    时间: 2012-12-12 19:02
高会仁 发表于 2012-12-10 15:49
1、这两个方法来自不同的类,sleep来自Thread类,和wait来自Object类。
    sleep是Thread的静态类方法, ...

明白了,谢了




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