多线程中join()

这个鬼东西百度了好久没弄明白,大佬们代码一粘贴好了完事,借助官方api终于是理解了,当然如果有问题欢迎大家用键盘来羞辱我.

首先  join有什么用?   他是用来确定线程何时结束的 ,

Thread提供了两种方法来确定线程何时结束,isAlive这里不做阐述,字面意思,字面用法

final void join() throws InterruptedExpetion
Oracle官方教程上面关于join是这样说的,mb大佬写的太晦涩看不懂

该方法将等待,一直到它调用的线程终止. 它的名字表示调用的线程会一直等待,直到指定的线程加入它.

该容器不会死,一直到容器里的线程死光. 它的没死表示肚子里线程还没死干净,人在塔在;

join的主线程,他们有加强版的铁索连环效应,join死,主线程死

看不懂我说的啥? 那先看例子,再回来看上面的.
===========================================================================================
例子1://main就是main函数 并且子线程跑的是一个方法体没东西的方法 , 然后 a和b进入同一个方法
main{

a.start();
b.start();

}
上面的代码会xjb跑, 顺序是这样的: 主线程开始->主线程结束->a和b(看脸谁先跑)->a和b(看脸谁先死);
                 如果连这个为什么都不知道,兄弟对不起我这篇不适合你看下去
===========================================================================================
例子2
main{

a.start();
a.join
b.start();

}
例子2的线程执行顺序:
主线程开始->线程a开始->线程a结束->主线程结束->线程b开始->线程b结束;
因为a线程 和 b线程 进入了同一个方法,但是a 在start后使用join,那么b会老老实实的等a先跑完,a不给b进房;
(a进容器了,join就是容器,a死了,join死了,带走主线程)
===========================================================================================
例子3
main{

a.start();
b.start();
a.join();

}
例子3的执行顺序:    
主线程开始->a 和 b 看脸谁先开始 ->a 和 b 看脸谁先死 -> 如果是a先死,那么主线程终止,b继续跑,跑完死;
                            |->如果是b先死,那么a继续跑,跑完a死,主线程死;


a线程开始跑方法了,然后仅接着,b线程也进入方法了,在这之后,a线程才调用jion方法,人家b线程又没出来,所以
他俩一起在房里面跑,这时候就体现join的作用了, 因为a调用了join(),所以只要a出来了(表示a线程结束),主线
程就结束;



b不管它在不在房间里,也不管b是不是早就出来了, 都和主线程无关; 他们没有一点联系.但是join和主线程有一个铁
索连环加强版;
(同样 a死了,join容器死了,主线程死了)
===========================================================================================

PS:

就子线程和主线程,或者说是线程和线程之间,他们本身就是没有任何联系的,你走你的我走我的,当它们发生矛盾了就需要我们
这种造物主来管理他们,

使用各种各样的方法来让他们有联系,让它们有高贵低贱,有先有后;

主线程和子线程,在主线程中创建子线程,但我不理解为主线程是子线程的载体,就好像170的父亲有了个180的孩子;

它们是同级的,有独立个体,只是作用不相同;
join方法的作用就是,调用它的线程终止,则主线程一起死;(join是容器,肚子里的线程死,容器死,带走主线程,容器外的该干啥干啥)
因为:每个线程都是独立的个体

===========================================================================================
再说说其他例子

例子4
main{

a.start();
a.join();
b.start();
b.join();

}
例子4的执行顺序:主线程开始->线程a开始->线程a结束->线程b开始->线程b结束->主线程关闭

join是一个容器,它里面存放着线程a和线程b,他俩不死光,主线程不死. 他俩死,不管容器外面还有没有其他线程,主线程都死
===========================================================================================


个人理解,有错欢迎大家评论,关于join自己也是在钻牛角尖,最后得出这个结论,会牢记取心,如果是错的,请指正,感谢!!!!
          

                                        

猜你喜欢

转载自www.cnblogs.com/lyuweigh/p/9568697.html