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();
    x=x - 1;
    System.out.println(x);
}public void run(){
    x *= 2;
}
}
what is the output if the main() method is run?
A 4
B 5
C 8
D 9
E Compilation fail
F An exception os thrown at runtime
G It is impossible to determine for certainscjp挺强调细节的,最近做的想吐= =
为啥join可以哪么用?他前面没有对象引用啊?
还有个问题,如果可以这么用,那主线程咋知道要加到哪个Thread的后面,要是这个程序有两个副Thread呢,他知道加在那个后面?
谢谢各位啦~

解决方案 »

  1.   

    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();//调用子线程的,优先级比较高,可以注释掉这里,然后结果会不确定,因为Starter先启动,通常会先打印9,然后再打印child
                    //sleep(100);//可以放开这里,让Starter休息一下,就会先打印child了,这个就是系统随机调用thread的结果。
    x = x - 1;
    System.out.println(x);
    } public void run() {
    x *= 2;
    }
    }
      

  2.   

    join() 等待该线程终止。调用谁的join()方法,谁先执行。