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();是通知另一个线程阻塞吗?

解决方案 »

  1.   

    1、执行顺序:laurel和hardy,这2个线程交替获得CPU的时间片,交替执行,具体分得的时间片可能不等
      

  2.   

    1、laurel.wait();是让它自己等等,让出一部分CPU时间给别人,高风亮节的一个线程。
      

  3.   

    1.这个程序的运行顺序是怎么样的?
    运行顺序是不好确定的,不同的操作系统或者不同的处理都不同
    2.书上说“一个线程不能通知另一个线程阻塞”,laurel.wait();是通知另一个线程阻塞吗?
    sleep是当前线程睡眠,不释放锁
    wait是通知某个对象进入等待状态,并且释放对该对象的锁定,其他对象可以拥有该对象,锁定该对象
      

  4.   

    答:
    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

    F
    情况2:若是hardy先执行,则打印出'D'后,被放入到laurel线程对象的wait等待队列中.此时laurel线程一直执行结束后,即它进入死亡后,JVM会laurel线程对象的wait等待队列中的hardy线程唤醒,然后:hardy线程一直执行结束.因此:执行结果是:
    D
    A
    C
    F2.laurel.wait();是通知另一个线程阻塞吗?是线程hardy自己要求被放入laurel线程对象的wait等待队列中等待的.
      

  5.   

    laurel.wait();是通知另一个线程阻塞吗?是线程hardy自己要求被放入laurel线程对象的wait等待队列中等待的. 
    好啊,原来是这样的,我一直以为是通知laurel等待,太感谢了。