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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陈虹旭 于 2012-10-14 12:15 编辑
  1. while(true)
  2. {
  3. synchronized(r)
  4. {

  5. if(r.flag)
  6. try{r.wait();}catch(Exception e){}
  7. if(x==0)
  8. {
  9. r.name="mike";
  10. r.sex="man";
  11. }
  12. else
  13. {
  14. r.name="丽丽";
  15. r.sex = "女女女女女";
  16. }
  17. x = (x+1)%2;
  18. r.flag = true;
  19. r.notify();
  20. }
  21. }
复制代码
以上是第一个线程
  1. while(true)
  2. {
  3. synchronized(r)
  4. {
  5. if(!r.flag)
  6. try{r.wait();}catch(Exception e){}
  7. System.out.println(r.name+"...."+r.sex);
  8. r.flag = false;
  9. r.notify();
  10. }
  11. }
复制代码
这是第二个线程

谁能给我解释下wait()和notify的具体实现流程啊 ,最好用一个简单的小例子说明下,看了视频好几遍了,还是看不明白,感觉好繁琐...
wai()和notify为什么不是Thread的子类而是Object的子类呢?
wait()和sleep()抛出的异常一般都如何解决呢?
还有notifyall()一般在什么情况下使用?

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 神马都是浮云

查看全部评分

3 个回复

倒序浏览
谁能给我解释下wait()和notify的具体实现流程啊 ,最好用一个简单的小例子说明下,看了视频好几遍了,还是看不明白,感觉好繁琐...
简单例子:
       妈妈煮饭没有油wait()一下,执行权交给儿子,儿子去打酱油,儿子打完酱油,notify()叫醒妈妈。执行权又回到妈妈手中。
wai()和notify为什么不是Thread的子类而是Object的子类呢?
      你应该知道在使用wait()和notify()都会使用锁,即它们必须使用在synchronized代码块或者同步函数中。
wait()和sleep()抛出的异常一般都如何解决呢?
      你看见有人处理IllegalMonitorStateException异常了吗,它是RuntimeException的子类,直接抛出就可以了,要是随便处理了,可能会隐藏问题。
还有notifyall()一般在什么情况下使用?
      notifyAll()一般在多线程的状态下使用,且有的线程处在冻结状态,即线程不止一个。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼上的例子举得不错。
wai()和notify为什么不是Thread的子类而是Object的子类?
因为等待和唤醒必须是同一个锁,而锁可以使任意对象,所以可以被任意对象调用的方法定义在Object类中。
notifyall() 的使用情况
多线程的时候,有时候需要唤醒所有线程,因为若用notify,容易出现只唤醒本方线程,而导致程序中其他所有线程等待的情况。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 赞一个!

查看全部评分

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