黑马程序员技术交流社区

标题: 多线程中的问题 [打印本页]

作者: j816326    时间: 2013-6-4 23:09
标题: 多线程中的问题
本帖最后由 j816326 于 2013-6-6 18:54 编辑

sleep() wait() 有什么区别? 等待唤醒机制中为什么要使用wait()方法而不使用sleep()方法?

作者: 郑锐    时间: 2013-6-4 23:37
线程wait()和sleep()的区别:
1.虽然都是使线程暂时停止执行的方法,但它们有很大的不同,sleep是线程类Thread 的方法,它是使当前线程暂时睡眠,可以放在任何位置。而wait是Object类的方法,它是使当前线程暂时放弃对象的使用权进行等待,必须放在同步方法或同步块里。
2.Sleep使用的时候,线程并不会放弃对象的使用权,即不会释放对象锁,所以在同步方法或同步块中使用sleep,一个线程访问时,其他的线程也是无法访问的。而wait是会释放对象锁的,就是当前线程放弃对象的使用权,让其他的线程可以访问。
3.线程执行wait方法时,需要另一个线程调用notify进行唤醒。而sleep只是暂时休眠一定时间,时间到了之后,自动恢复运行,不需另外的线程唤醒。
作者: 小冰块    时间: 2013-6-5 00:33
楼上说的很专业,其实也可以这么说:
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源,
sleep是静态方法,是谁掉的谁去睡觉,就算是在main线程里调用了线程b的sleep方法,实际上还是main去睡觉,想让线程b去睡觉要在b的代码中掉sleep

关于为什么用wait而不是sleep,其实就一句话:wait的时候你可以通过notify来唤醒,很好控制,如果你sleep的话要填多长时间合适呢?
作者: 杨青    时间: 2013-6-5 00:34
  sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非 (1)醒来的线程具有更高的优先级(2)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。 当调用wait()后,线程会释放掉它所占有的锁标志,从而使线程所在对象中的其它synchronized数据可被别的线程使用。



作者: 杨青    时间: 2013-6-5 00:37
本帖最后由 杨青 于 2013-6-5 00:41 编辑

这些其实可以再老师的视频中详细的找到




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2