对于下面的代码,预期输出为:
Waiting for b to complete...
Total is: 4950
为什么它不能在之后打印Total is..
然后Waiting for b..
?我认为b.start()
在某些情况下可以先执行 ,然后在ThreadB
锁定synchronized(this)
ThreadB.run()
synchronized(b)
1}}因此阻止主要进入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(InterruptedException e) {
e.printStackTrace();
}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread {
int total;
@Override
public void run() {
synchronized(this) {
for(int i=0; i<100 ; i++) {
total += i;
}
notify();
}
}
}
。
我刚才所说的有什么问题吗?
cdef extern from "foo.h":
struct A:
pass
# or (I've added this bit - not in the documentation directly...)
ctypedef struct B:
pass
答案 0 :(得分:3)
两个输出语句始终具有相同的顺序,因为它们在一个线程上执行。等待另一个线程在它们之间完成不会改变它们的执行顺序。
如果你把&#34; Total is ...&#34;输出到b {'1}}的末尾,那么可能有机会看到输出的不确定性顺序。
编辑 - 请注意@Holger对此答案的评论:
[...]在不太可能但仍然可能的情况下,首先执行ThreadB的同步块,其notify()调用将无效,因为没有人等待然后,ThreadA的wait()调用可能会挂起永远不会有后续通知。
答案 1 :(得分:-4)
这里的实际问题是你这里只有一个线程“b”,你在b上调用wait(),它将b线程转换为WAIT状态,并且没有其他线程可以通知这个线程并带回b运行状态。