public class WaitThread {
public static void main(String[] args) {
CalcThread calcThread = new CalcThread();
calcThread.start();
synchronized (calcThread) {
//try {
// calcThread.wait();
//} catch (InterruptedException e) {
// e.printStackTrace();
//}
System.out.println("Total is: " + calcThread.total);
}
}
static class CalcThread extends Thread {
int total;
@Override
public void run() {
synchronized (this) {
for (int i = 0; i < 100; i++) {
total += i;
}
notify();
}
}
}
}
新手入坑,求助各位大佬们解惑。
感谢感谢感谢!!!
我想问一下,上面代码运行时,因为同步块的原因main会优先一步获得calcThread对象的锁,而calcThread线程会进入锁等待阶段,从而先执行mian方法中的打印操作。也就是最后的输出结果是:Total is: 0。
但是当注释的代码打开的时候,在同步块内调用calcThread.wait()。
我的想法是,这里不是让线程calcThread进入等待并且释放calcThread持有的锁吗?按理说锁应该还是在main手上,这样的话calcThread run里面的notify根本无法执行。最后的打印结果应该仍然是Total is: 0。
实际上输出是Total is: 4950,wait释放的是main持有的calcThread的锁,使main方法进入等待,等待线程calcThread调用notify,唤醒main的线程,使自己继续进入BLOCKED状态。
看到这里我晕了,所以想问一下,这里的wait、notify到底作用在谁身上??