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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张庚 中级黑马   /  2013-2-7 15:32  /  996 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class ReaderResult extends Thread {   
    Calculator c;   
  
    public ReaderResult(Calculator c) {   
            this.c = c;   
    }   
  
    public void run() {   
            synchronized (c) {   
                    try {   
                            System.out.println(Thread.currentThread() + "等待计算结果。。。");   
                            c.wait();   
                    } catch (InterruptedException e) {   
                            e.printStackTrace();   
                    }   
                    System.out.println(Thread.currentThread() + "计算结果为:" + c.total);   
            }   
    }   
  
    public static void main(String[] args) {   
            Calculator calculator = new Calculator();   
            //启动三个线程,分别获取计算结果   
            new ReaderResult(calculator).start();   
            new ReaderResult(calculator).start();   
            new ReaderResult(calculator).start();   
            //启动计算线程   
            calculator.start();   
               
    }   
}  


public class Calculator extends Thread {   
    int total;   
    public void run() {   
            synchronized (this) {   
                System.out.println(total);   
                    for (int i = 0; i < 101; i++) {   
                            total += i;   
                    }   
                    System.out.println(total);      
            }   
    }   
}  

就2个简单的类 , 以我的认识,应该在c.wait()这里卡住,也就是说应该不会输出“计算结果为:" ”这些话。  但是为什么他有时候会输出呢?(有时候不会)。 到底是什么破坏了wait 状态?  应该不是start, 因为有时候是先输出System.out.println(total)这里, 然后再打印等待计算结果。。  高人请指点下

1 个回复

倒序浏览
本帖最后由 李桐 于 2013-2-8 23:49 编辑

new ReaderResult(calculator).start();   
new ReaderResult(calculator).start();   
new ReaderResult(calculator).start();   
//前三个线程启动,但是上了锁,只有一个可以到达wait,cpu有一定概率先执行到wait语句
calculator.start();   
//最后一个线程启动,cpu也有一定概率执行输出语句在wait方法调用之前
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马