黑马程序员技术交流社区
标题: sleep() 和wait() 有什么区别? [打印本页]
作者: 491138002 时间: 2014-4-2 11:58
标题: sleep() 和wait() 有什么区别?
本帖最后由 491138002 于 2014-4-3 15:03 编辑
sleep() 和wait() 都能让线程暂停,那有什么不一样的呢
作者: xuehuayous 时间: 2014-4-2 12:09
wait()释放资源,释放锁;
sleep()释放资源,不释放锁
这个毕老师在12天第一节有讲到的,希望对你有帮助!
作者: xuehuayous 时间: 2014-4-2 12:12
sleep()方法:
当程序运行Thread.sleep(100L);时,休眠100毫秒,同时交出CPU时间片,100毫秒,重新进入运行状态,等待CPU重新分配时间片,而线程交出时间片时,CPU拿时间片,由操作系统负责客运行状态线程选并分配时间片
wait()方法:程序运行时,遇wait()方法,时线程进入当前对象等待队列并交出CPU,等待其线程notifyALL()时,才能重新回运行状态,等待OS分配CPU
就是说sleep有时间限制的就像闹钟一样到时候就叫了,而wait是无限期的除非用户主动notify
作者: Up↑Lee↗ 时间: 2014-4-2 12:15
sleep和wait都是使线程暂时停止执行的方法,但它们有很大的不同,
sleep是线程类Thread 的方法,
它是使当前线程暂时睡眠,可以放在任何位置。
而wait是Object类的方法,它是使当前线程暂时放弃对象的使用权进行等待,
必须放在同步方法或同步块里。
Sleep使用的时候,线程并不会放弃对象的使用权,即不会释放对象锁,所以在同步方法或同步块中使用sleep,一个线程访问时,其他的线程也是无法访问的。
而wait是会释放对象锁的,就是当前线程放弃对象的使用权,让其他的线程可以访问。
线程执行wait方法时,需要另一个线程调用notify进行唤醒。
而sleep只是暂时休眠一定时间,时间到了之后,自动恢复运行,不需另外的线程唤醒。
作者: anqi 时间: 2014-4-2 12:17
看意思就知道了,sleep是说你睡觉吧,谁调用谁睡觉,里面一般跟睡觉的时间。时间到了就自然醒。它是来在Thread类的方法。不会释放锁。也就是不会释放系统资源。
wait是你等一下,别人先运行,这个方法来在上帝类Object。它会释放锁,具体什么时候恢复运行需要时间到或者notify方法唤醒,并且醒了也不一定能运行。它的作用就是释放系统资源给别人用。
作者: 闲人 时间: 2014-4-2 12:18
他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步锁.
wait()需要用notify()和notifyall()来唤醒,才会再次运行
而sleep()在足够时间后,会自动继续运行
作者: Engle 时间: 2014-4-2 15:45
wait和sleep区别: 分析这两个方法:从执行权和锁上来分析:
wait:可以指定时间也可以不指定时间。不指定时间,只能由对应的notify或者notifyAll来唤醒。
sleep:必须指定时间,时间到自动从冻结状态转成运行状态(临时阻塞状态)。
wait:线程会释放执行权,而且线程会释放锁。
Sleep:线程会释放执行权,但不是不释放锁。
作者: 黄泉 时间: 2014-4-2 16:01
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毫秒。
作者: z1342802487 时间: 2014-4-2 16:44
wait方法便当线程变为阻塞状态,主动释放互斥锁,不能指定时间;sleep方法不会释放互斥锁,可以指定一定时间内不会占用CPU资源。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |