public class TwoThreads {
static Thread laurel, hardy; public static void main(String[] args) {
laurel = new Thread() {
public void run() {
System.out.println("A");
try {
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.这个程序的运行顺序是怎么样的?
2.书上说“一个线程不能通知另一个线程阻塞”,laurel.wait();是通知另一个线程阻塞吗?
static Thread laurel, hardy; public static void main(String[] args) {
laurel = new Thread() {
public void run() {
System.out.println("A");
try {
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.这个程序的运行顺序是怎么样的?
2.书上说“一个线程不能通知另一个线程阻塞”,laurel.wait();是通知另一个线程阻塞吗?
运行顺序是不好确定的,不同的操作系统或者不同的处理都不同
2.书上说“一个线程不能通知另一个线程阻塞”,laurel.wait();是通知另一个线程阻塞吗?
sleep是当前线程睡眠,不释放锁
wait是通知某个对象进入等待状态,并且释放对该对象的锁定,其他对象可以拥有该对象,锁定该对象
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
F2.laurel.wait();是通知另一个线程阻塞吗?是线程hardy自己要求被放入laurel线程对象的wait等待队列中等待的.
好啊,原来是这样的,我一直以为是通知laurel等待,太感谢了。