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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张奇云 黑马帝   /  2011-10-19 21:13  /  3746 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

线程中sleep() 和 wait() 有什么区别?

6 个回复

倒序浏览
sleep()是线程睡眠自动醒来,后面跟时间参数,wait()和notify()一起用,wait()相当于一个对象的等待池,线程进入后放弃所旗标进入睡眠状态,直到另一个线程调用notify()将在等待池中的第一个等待线程唤醒
回复 使用道具 举报
陈超 黑马帝 2011-11-11 07:58:33
藤椅
还有就是wait和notify必须是同一个锁上的,锁可以是任意对象
回复 使用道具 举报
张翼 黑马帝 2011-11-13 10:12:03
板凳
概括的说,sleep方法是自己等自己,因为sleep方法是有参数的,参数的作用就是设定时间,设定的参数的作用就是设定等待的时间;wait方法是等别人,等别的线程结束了,他自己才能继续运行。
回复 使用道具 举报
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源。

wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源,

sleep是静态方法,是谁调用的谁去睡觉,就算是在main线程里调用了线程t的sleep方法,实际上还是main去睡觉,想让线程t去睡觉要在b的代码中调用sleep

sleep(100)是占用cpu,线程休眠100毫秒,其他进程不能再占用cpu资源,
wait(100)是进入等待池中等待,交出cpu等系统资源供其他进程使用,在这100毫秒中,该线程可以被其他线程notify(唤醒),但不同的是其他在等待池中的线程不被notify就不会出来,但这个线程在等待100毫秒后会自动进入就绪队列等待系统分配资源,换句话说,sleep(100)在100毫秒后肯定会运行,但wait在100毫秒后还有等待os调用分配资源,所以wait100的停止运行时间是不确定的,但至少是100毫秒
回复 使用道具 举报
沙路 黑马帝 2011-11-24 16:24:45
地板
本帖最后由 沙路 于 2011-11-24 16:26 编辑
zhou_411424 发表于 2011-11-21 07:31
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源。

w ...


我觉得你说的:其他线程不能占用cpu,此有错误,我在看老师讲的多线程的时候,说的是在sleep(10)是程序在此休眠10毫秒,其他的线程有可能开始执行,在十秒过后此线程醒来,继续执行。而wait()函数则是说程序在此等待,等待其它线程执行,直到与此函数锁在一起的notify()被执行,则从wait()后继续开始执行
回复 使用道具 举报
wait()
wait方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用wait方法
wait()方法使当前线程暂停执行并释放对象锁标志
sleep()
使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是如果有Synchronized同步块,其他线程仍然不同访问共享数据。注意该方法要捕获异常

比如有两个线程同时执行(没有Synchronized),一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完成后,低优先级的线程才能执行;但当高优先级的线程sleep(5000)后,低优先级就有机会执行了。

总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。

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