public class TwoThreads {
static Thread laurel, hardy;
public static void main(String[] args) {
laurel = new Thread() {
public void run() {
System.out.println("A");
try {
hardy.sleep(1000);
} catch (Exception e) {
System.out.println("B");
}
System.out.println("C");
}
};
hardy = new Thread() {
public void run() {
synchronized(laurel){
System.out.println("D");
try {
laurel.wait();
} catch (Exception e) {
System.out.println("E");
}
System.out.println("F");
}
}
};
laurel.start();
hardy.start();
}
static Thread laurel, hardy;
public static void main(String[] args) {
laurel = new Thread() {
public void run() {
System.out.println("A");
try {
hardy.sleep(1000);
} catch (Exception e) {
System.out.println("B");
}
System.out.println("C");
}
};
hardy = new Thread() {
public void run() {
synchronized(laurel){
System.out.println("D");
try {
laurel.wait();
} catch (Exception e) {
System.out.println("E");
}
System.out.println("F");
}
}
};
laurel.start();
hardy.start();
}
}
分析:
1.可能是:laurel先执行,也可能是hardy先执行.不妨我们再详细分析一下:
情况1:若是laurel先执行,则执行结果是:laurel打印出'A'后sleep(),让出CPU,hardy开始执行,hardy打印出'D'后调用laurel.wait(),使得自己(指:hardy线程)被放入到laurel线程对象的wait等待队列中,此时laurel线程一直执行结束后,即它进入死亡后,JVM会laurel线程对象的wait等待队列中的hardy线程唤醒,然后:hardy线程一直执行结束.因此:执行结果是:
A
D
C
F
情况2:若是hardy先执行,则打印出'D'后,被放入到laurel线程对象的wait等待队列中.此时laurel线程一直执行结束后,即它进入死亡后,JVM会laurel线程对象的wait等待队列中的hardy线程唤醒,然后:hardy线程一直执行结束.因此:执行结果是:
D
A
C
F
2.laurel.wait();是通知另一个线程阻塞吗?是线程hardy自己要求被放入laurel线程对象的wait等待队列中等待的.