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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐-星星 中级黑马   /  2012-10-1 21:07  /  1947 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程中有两个用于延迟的函数
sleep() 和 wait() 看了视频 我把所有代码的wait()方法和sleep()都给调用了
基本都能用 ,既然这样为什么还要两个方法
请高手为我回答一下 它们有啥区别呢
那种情况下可以用wait(),那种情况下可以用sleep()

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
wait()需要notify()唤醒,而sleep()是睡眠时间到了就自己醒了。
而当在一个Synchronized方法中调用sleep()时,线程虽然休眠了,但是对象的机锁没有被释放,其他线程仍然无法访问这个对象。
而wait()方法则会在线程休眠的同时释放掉机锁,其他线程可以访问该对象.
所以用到同步的时候,根据需求使用不同的方法。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
wait()和sleep()的区别
1,sleep()必须指定时间,如果没有指定,必须用notify唤醒。而wait()可以指定时间,也可以不用指定时间。
2,wait()方法必须定义在同步中,sleep方法不一定
3,在同步中wait() sleep()对于执行权和锁的处理不同。
sleep()释放cpu执行权,但是没有释放锁
wait()释放执行权,释放锁

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
sleep和wait的区别有:
  1,这两个方法来自不同的类分别是Thread和Object
   2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
  3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用   
         synchronized(x){      
                           x.notify()     //或者wait()   
              }   
   4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马