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; } }
加个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; } }
join()即this.join(); 这里的this就是Starter的一个实例,主线程调用该实例的join方法后,无条件等待Starter线程,直到Starter线程运行结束。
要是这个程序有两个副Thread,在哪个thread引用上调用join(),就等待哪个线程。
就是调用了哪个子线程的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;
}
}
而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;
}
}
以上为我对大家回答的理解不对的地方请指出,谢谢啦~