[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 正解