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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 491138002 中级黑马   /  2014-4-2 11:58  /  1785 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 491138002 于 2014-4-3 15:03 编辑

sleep() 和wait() 都能让线程暂停,那有什么不一样的呢

8 个回复

倒序浏览
wait()释放资源,释放锁;
sleep()释放资源,不释放锁
这个毕老师在12天第一节有讲到的,希望对你有帮助!
回复 使用道具 举报 1 0
sleep()方法:
当程序运行Thread.sleep(100L);时,休眠100毫秒,同时交出CPU时间片,100毫秒,重新进入运行状态,等待CPU重新分配时间片,而线程交出时间片时,CPU拿时间片,由操作系统负责客运行状态线程选并分配时间片

wait()方法:程序运行时,遇wait()方法,时线程进入当前对象等待队列并交出CPU,等待其线程notifyALL()时,才能重新回运行状态,等待OS分配CPU
就是说sleep有时间限制的就像闹钟一样到时候就叫了,而wait是无限期的除非用户主动notify

评分

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

查看全部评分

回复 使用道具 举报
sleepwait都是使线程暂时停止执行的方法,但它们有很大的不同,
sleep是线程类Thread 的方法,
它是使当前线程暂时睡眠,可以放在任何位置。
waitObject类的方法,它是使当前线程暂时放弃对象的使用权进行等待,
必须放在同步方法或同步块里。
Sleep使用的时候,线程并不会放弃对象的使用权,即不会释放对象锁,所以在同步方法或同步块中使用sleep,一个线程访问时,其他的线程也是无法访问的。
wait是会释放对象锁的,就是当前线程放弃对象的使用权,让其他的线程可以访问。
线程执行wait方法时,需要另一个线程调用notify进行唤醒。
sleep只是暂时休眠一定时间,时间到了之后,自动恢复运行,不需另外的线程唤醒。

评分

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

查看全部评分

回复 使用道具 举报
看意思就知道了,sleep是说你睡觉吧,谁调用谁睡觉,里面一般跟睡觉的时间。时间到了就自然醒。它是来在Thread类的方法。不会释放锁。也就是不会释放系统资源。
wait是你等一下,别人先运行,这个方法来在上帝类Object。它会释放锁,具体什么时候恢复运行需要时间到或者notify方法唤醒,并且醒了也不一定能运行。它的作用就是释放系统资源给别人用。

评分

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

查看全部评分

回复 使用道具 举报
他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步锁.
wait()需要用notify()和notifyall()来唤醒,才会再次运行
而sleep()在足够时间后,会自动继续运行
回复 使用道具 举报
wait和sleep区别: 分析这两个方法:从执行权和锁上来分析: 
wait:可以指定时间也可以不指定时间。不指定时间,只能由对应的notify或者notifyAll来唤醒。 
sleep:必须指定时间,时间到自动从冻结状态转成运行状态(临时阻塞状态)。
wait:线程会释放执行权,而且线程会释放锁。 
Sleep:线程会释放执行权,但不是不释放锁。

评分

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

查看全部评分

回复 使用道具 举报
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源,  sleep是静态方法,是谁掉的谁去睡觉,就算是在main线程里调用了线程b的sleep方法,实际上还是main去睡觉,想让线程b去睡觉要在b的代码中掉sleep  sleep(100L)是占用cpu,线程休眠100毫秒,其他进程不能再占用cpu资源,wait(100L)是进入等待池中等待,交出cpu等系统资源供其他进程使用,在这100毫秒中,该线程可以被其他线程notify,但不同的是其他在等待池中的线程不被notify不会出来,但这个线程在等待100毫秒后会自动进入就绪队列等待系统分配资源,换句话说,sleep(100)在100毫秒后肯定会运行,但wait在100毫秒后还有等待os调用分配资源,所以wait100的停止运行时间是不确定的,但至少是100毫秒。

评分

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

查看全部评分

回复 使用道具 举报
wait方法便当线程变为阻塞状态,主动释放互斥锁,不能指定时间;sleep方法不会释放互斥锁,可以指定一定时间内不会占用CPU资源。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马