JAVA 多线程的问题

[code="java"]
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(); 

} 

}
[/code]
[code="java"]
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);

}
}
}
[/code]

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

应该是calculator.start();这句被执行的原因
因为线程的执行顺序是由cpu随机分配的,当执行new ReaderResult(calculator).start()后,会在calculator.wait()这里挂起等待calculator的被执行结束或者被唤醒,当线程calculator被执行结束时,ReaderResult引用的Calculator也就执行结束了,(线程执行结束后应该会有自动唤醒机制,这是native方法,没看到具体的实现,所以c.wait()也就失效了),而那些在calculator.start()执行完成后才执行的线程,就会一直等待下去了

你将第一个线程类中的同步关键字c换成其他的对象试一下,如object对象。。看能否得到预期的结果?

是start 改变了线程线程状态。 至于你说怎么会先输出结果 然后打出 计算结果。 这个应该和cpu随即处理线程有关。

Francis_java 正解