zoukankan      html  css  js  c++  java
  • 多线程中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自己也是在钻牛角尖,最后得出这个结论,会牢记取心,如果是错的,请指正,感谢!!!!
              

                                            
  • 相关阅读:
    ecshop 浏览历史样式的修改
    onmouseover 执行 ToolTip 控件
    e​c​s​h​o​p​模​板​ l​b​i​文​件
    JS中 document.getElementById 对象
    JS CSS 网页 简单 右侧 悬浮
    css 简单 返回顶部 代码及注释说明
    php截取等长UFT8中英文混合字串
    Smarty中模板eq相等 ne、neq不相等, gt大于, lt小于
    iOS UI-集合视图(UICollectionView)
    iOS UI-表格控制器(UITableView)-基本使用
  • 原文地址:https://www.cnblogs.com/lyuweigh/p/9568697.html
Copyright © 2011-2022 走看看