我无法找到ThreadA仅在ThreadB完成其工作时才从ThreadB获取通知的原因。如果我发表评论notify()无论如何都会收到通知。
ThreadB在完成工作后会自动发送通知吗?
为什么ThreadB没有按时通知ThreadA?
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();
System.out.println("waiting done");
} catch (InterruptedException e) {}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread {
int total=0;
public void run() {
synchronized(this)
{
for(int i=0;i<10;i++)
{
System.out.println(Thread.currentThread().getName()+" "+ Integer.toString(i));
total += i;
}
notify();
System.out.println("notify done");
for(int i=0;i<100;i++)
{
System.out.println(Thread.currentThread().getName()+" "+ Integer.toString(i));
total += i;
}
}
}
}
输出:
Waiting for b to complete...
Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9
notify done
Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9
Thread-0 10
Thread-0 11
Thread-0 12
Thread-0 13
Thread-0 14
Thread-0 15
Thread-0 16
Thread-0 17
Thread-0 18
Thread-0 19
waiting done
Total is: 235
补充问题 - 为什么道达尔输出为235?
答案 0 :(得分:5)
首先,请不要使用这样的Thread
个对象。 Thread
使用wait
和notify
本身,因此您可以很容易地收到令人困惑的信号。
你没有看到“等待完成”直到结束的原因是ThreadB.run
调用了notify()
,然后它继续在synchronized
块中继续 。 wait()
方法在重新获取监视器之前不会返回 - 在同步块结束之前它不能执行。
总数只是将所有数字相加的总数 - 看起来你实际上是以第二个限制为20,而不是10 ......和(0 + 1 + 2 + ... 9)+ (0 + 1 + 2 + ... 19)是235.目前尚不清楚为什么你会期待别的。