join的作用
只有等子线程执行结束,主线程才能结束。
可以等价==> 只有等调用join的子线程代码执行完毕,才开始执行主线程中join之后的代码。(自己总结的这句话)
示例
例子1
a.start();
a.join
b.start();
线程执行顺序:
主线程开始->线程a开始->线程a结束->主线程结束->线程b开始->线程b结束;
因为a线程 和 b线程 进入了同一个方法,但是a 在start后使用join,那么b会老老实实的等a先跑完,a不给b进房;(a进容器了,join就是容器,a死了,join死了,带走主线程)。
例子2
main{
a.start();
b.start();
a.join();
}
线程执行顺序:
主线程开始->a 和 b 看脸谁先开始 ->a 和 b 看脸谁先死 -> 如果是a先死,那么主线程终止,b继续跑,跑完死; |->如果是b先死,那么a继续跑,跑完a死,主线程死;
a线程开始跑方法了,然后仅接着,b线程也进入方法了,在这之后,a线程才调用jion方法,人家b线程又没出来,所以 他俩一起在房里面跑,这时候就体现join的作用了, 因为a调用了join(),所以只要a出来了(表示a线程结束),主线 程就结束;
其他例子
更多的详细例子:https://blog.csdn.net/sinat_38068807/article/details/88742964
我的案例
public class thread {
public static void main(String[] args) throws InterruptedException {
// 1000个线程【依次】被创建、执行任务(输出序号)、销毁
test1();
}
static void test1() throws InterruptedException {
for(int i = 0 ; i < 1000 ; i ++){
int finalI = i;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(finalI);
}
});
thread.start();
thread.join();
}
}
}
如果把thread.join();注释掉,那么输出的结果是【无序】的。