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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Kevin123 中级黑马   /  2012-12-10 15:34  /  1700 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 白良锦 于 2012-12-13 13:54 编辑

看基础视频多线程时老师讲到过sleep 和wait,请问sleep() wait()应用中 有什么具体区别?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
本帖最后由 高会仁 于 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()
   }

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
sleep()是让线程暂定一下,在指定的时间后自动开启,
wait()暂停后需要用notify()方法唤醒,否则不继续

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
区别一:

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

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

  

   区别二 :

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

使用区域  

由于wait函数的特殊意义,所以他是应该放在同步语句块中的,这样才有意义    。
   注意:两个方法都需要抛出异常
回复 使用道具 举报
sleep()可以传入一个时间参数,可以控制时间,wait()无法控制睡眠时间,只能使用notify()进行唤醒。
回复 使用道具 举报
简单说一下,我觉得挺好理解的。
wait():可以加时间也可以不加时间,释放执行权,也释放锁
sleep():必须加时间,释放执行权,但是不释放锁  

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

明白了,谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马