代码如下所示,如果让线程b等待--b.wait();输出:Total is: 45;但如果把b.wait()这行注释了,可能输出Total is: 0;这个weit()到底起到了什么作用?
public class ThreadA {
public static void main(String[] args) {
ThreadB b = new ThreadB();
b.start();
synchronized (b) {
try {
System.out.println("Waiting for b to complete...");
b.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("Total is: " + b.total);
}
}
class ThreadB extends Thread {
int total;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
total += i;
}
}
}
------解决方案--------------------
不知道你这个代码是自己写的还是在那里看的,不知道为了实现什么逻辑。我给你解释下代码是怎么执行的。
b.wait()是让主线程休眠,释放锁。这时b.start还在执行,没执行完,当执行完时会唤醒b对象监听的所有线程,主线程被唤醒了,这时total已经被加到45了,所以会打出45。
如果b.wait()注释掉,2个线程是并行的,b.run里的代码还没执行到就会输出0,执行到就会输出45,你机器上打出0,在我的机器是打出的还是45。打出的数字其实没准。
b.start这个方法执行完时会唤醒b对象监听的所有线程,这个事情挺神奇,我以前还不知道,测试了下才发现这个事。