本帖最后由 yhcdio 于 2010-05-23 08:45:22 编辑

解决方案 »

  1.   

    输出9.
    join()即this.join(); 这里的this就是Starter的一个实例,主线程调用该实例的join方法后,无条件等待Starter线程,直到Starter线程运行结束。
    要是这个程序有两个副Thread,在哪个thread引用上调用join(),就等待哪个线程。
      

  2.   

    join()方法,按照jdk的说法 Waits for this thread to die. 等待本线程的死亡。
    就是调用了哪个子线程的join()方法,父线程就要等待该子线程执行完毕,才继续父线程的动作。
    注意是调用谁的join()方法,谁先执行。
    比如调用了如果启动了A线程,A线程又创建了B线程,同时调用了B.join()方法,则A线程等待B线程执行完毕,才继续执行自己的动作,如果不执行B线程的join()方法,则执行先后顺序不固定。
    比如把样例修改一下
    package com.rsky.test;public class Starter extends Thread {
    private int x = 2; public static void main(String[] args) throws Exception {
    new Starter().makeItSo(); } public Starter() {
    x = 5;
    start();
    } private void makeItSo() throws Exception {
    join(); //自己调用自己的
    Thread t = new Thread(){public void run(){System.out.println("child");}};
    t.start();
    t.join();//调用子线程的,优先级比较高,可以注释掉这里,然后结果会不确定
    x = x - 1;
    System.out.println(x);
    } public void run() {
    x *= 2;
    }
    }
      

  3.   

    加个sleep(100)可以看出系统随机调用thread的不确定性。
    而join()正好强调了执行的先后顺序。package com.rsky.test;public class Starter extends Thread {
    private int x = 2;public static void main(String[] args) throws Exception {
    new Starter().makeItSo();}public Starter() {
    x = 5;
    start();
    }private void makeItSo() throws Exception {
    join(); //自己调用自己的
    Thread t = new Thread(){public void run(){System.out.println("child");}}; 
    t.start();
    t.join();//调用子线程的,优先级比较高,可以注释掉这里,然后结果会不确定,因为Starter先启动,通常会先打印9,然后再打印child
      //sleep(100);//可以放开这里,让Starter休息一下,就会先打印child了,这个就是系统随机调用thread的结果。
    x = x - 1;
    System.out.println(x);
    }public void run() {
    x *= 2;
    }
    }
      

  4.   

    明白了, 有两个方法栈,mian()的Thread有Starter()和makeItSo()两个方法,当调用Starter()时,会启动Starter()的Thread,此时mian()的Thread调用makeItSo(),由于mian()的Thread的栈中已经有了Starter()对象,所以makeItSo()中会是Starter对象.join()。由于mian()的Thread的栈中所以main的Thread要等待Starter()的Thread.
    以上为我对大家回答的理解不对的地方请指出,谢谢啦~