我是Java多线程的新手,我正在尝试编写一个简单的程序来模拟线程间通信。
问题是我的main
方法直到我交换以下两行后才终止。
t1.start();// if I call t2.start() first and then t1.start() then it works perfectly
t2.start();
有人可以解释为什么我需要在t1.start()之前调用t2.start()吗?
这是我的代码
public class WaitNotifyExample {
public static void main(String[] args) throws InterruptedException {
System.out.println("main method starts");
A a = new A();
Thread t1 = new Thread(new Runnable() {
public void run() {
try {
a.printNumbers();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
try {
a.afterPrintNumbers();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// This works fine but I don't understand why..
t2.start();
t1.start();
t1.join();
t2.join();
System.out.println("main method ends");
}
}
class A{
public void printNumbers() throws InterruptedException{
synchronized(this){
for(int i = 0;i<10;i++){
System.out.println(i);
}
this.notify();
}
}
public void afterPrintNumbers() throws InterruptedException{
synchronized(this){
this.wait();
System.out.println("all no. printed");
}
}
}
答案 0 :(得分:3)
如果我先调用t2.start(),然后再调用t1.start(),那么它将运行完美
不能保证。
只需考虑,t1
首先执行this.notify();
,然后t2
执行this.wait();
。
在这种情况下,t2
将永远不会收到信号。
答案 1 :(得分:1)
不能保证线程执行的顺序,它取决于线程调度程序算法。
因此,在您的情况下,JVM选择了t1并在t2执行this.notify()
之前完成了this.wait()
的执行,如前所述。