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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 松鼠 初级黑马   /  2013-12-15 19:31  /  1722 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

他们到底有什么区别?   我看视频看的很晕

评分

参与人数 1黑马币 +3 收起 理由
乔兵 + 3

查看全部评分

9 个回复

倒序浏览
sleep ()  不需要唤醒         wait() 需要唤醒
回复 使用道具 举报
我的个人理解:

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

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

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报 1 0
{:soso_e179:}学习了
回复 使用道具 举报
相同:都进入冻结状态,放弃执行资格,cpu会去执行其他线程。
不同:sleep()等时间到自己会醒来,线程继续运行;wait()后必须要有notify()方法唤醒。更重要的是在同步中,sleep()不会放弃锁,而wait()会放弃锁。
回复 使用道具 举报
Knife 中级黑马 2013-12-16 01:34:15
7#
sleep是定时间,过了定的时间自己会继续运行,而wait()是要有方法唤醒后才能继续运行
回复 使用道具 举报
恩恩 中级黑马 2013-12-16 03:20:37
8#
要想知道是怎么回事你就需要了解这个是干什么的,这两个方法的作用都是让当前的线程放弃CPU资源,让CPU去执行其他的线程,这样可以体现一个分时的平均性,在某种程度上说是合理的利用CPU资源。但是这两个方法有一定的不同,就是sleep是有一个时间设定,就是当前这个线程休息多长时间或者睡眠多长时间,等时间一到这个线程会自动启动,如果当前没有线程在运行,那么很自然的这个线程被运行,不过可能性很小。然而wait这个方法是被停用了,你必须要有一种唤醒的机制来叫醒它,否则他就永远睡眠。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
楼上回答的都很全面了但是我想提醒一下,wait也是可以规定时间的,wait有一种是wait(long timeout)还有一种是wait(long timeout,int nanos)
回复 使用道具 举报
    Thread.sleep ()使当前线程在指定的时间处于“非运行”状态。线程一直持有对象的监视器。如果另一线程调用了 interrupt ()方法,它将唤醒那个“睡眠的”线程。
    object.wait ()使当前线程处于“不可运行”状态,和 sleep ()不同的是 wait 是 object 的方法而不是 thread。调用 object.wait ()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用 object.notify (),这样将唤醒原来等待中的线程,然后释放该锁。基本上 wait ()/notify ()与 sleep ()/interrupt ()类似,只是前者需要获取对象锁。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

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