zoukankan      html  css  js  c++  java
  • 多线程中多个join的执行过程

           闲话不多说,直接看代码:
    var c = new Counter();
           //new了3个线程
    var t1 = new Thread(() => TestCounter(c)); var t2 = new Thread(() => TestCounter(c)); var t3 = new Thread(() => TestCounter(c));

           第一种情况:
           //3个线程同时执行(注意这里了3个Start,说明3个线程都已经开始干活)这时主线程会等待3个线程执行完毕,主线程再执行(不一定是谁先完事,所以都要加上join方法) t1.Start(); t2.Start(); t3.Start();
    //3个线程都开始执行 t1.Join();//让主线程等待t1 t2.Join();//让主线程等待t2 t3.Join();//让主线程等待t3 //可不可以只写t3.Join(),去掉其他两个join呢??????**************不可以,因为是多线程,并不一定是t3最后执行完毕的,所以3个线程都要写Join(),运行完就让主线程继续等下一个。

           //Thread.Sleep(xxx);                 //有的人可能会说,我可不可以不写join,在这个地方写个Thread.Sleep(xxx);呢,答案是也不行,Sleep里面的数字写多少合适呢?少了的话,上面的线程不一定执行的完,写多了又白白浪费时间。        //第二种情况:         //实际相当于单线程的执行效率(3个线程,依次执行) t1.Start();//线程t1开始执行 t1.Join();//主线程等待t1(t2、t3都停止执行) t2.Start();//线程t2开始执行 t2.Join();//主线程等待t2执行完毕(下面t3停止执行) t3.Start();//线程t3开始执行 t3.Join();//主线程等待t3执行完毕


    如果完全不写join语句可以吗?
    1.如果主线程什么都不做了,可能没有问题
    2.如果主线程接下来需要调用子线程的执行结果,如果不写join语句(那么主线程就不会等待上边的子线程执行完毕)而继续执行下面的操作,此时主线程取得并使用的数据就很有可能是子线程执行了一部分的数据(半成品)啊。

    所以join的作用就是主线程等待子线程执行完毕了,把活干完了,主线程才能拿着子线程执行完后的完整数据去继续执行(干活)。
  • 相关阅读:
    frida枚举当前加载的模块以及模块中方法
    python request请求时候json严格校验怎么去除空格
    firda-so静态注册
    LeetCode 724. 寻找数组的中心索引
    LeetCode 679. 24点游戏
    LeetCode 845. 数组中的最长山脉
    并查集各种情况下的时间复杂度
    LeetCode 547. 省份数量
    LeetCode 5. 最长回文子串
    LeetCode 103. 二叉树的锯齿形层序遍历
  • 原文地址:https://www.cnblogs.com/gougou1981/p/12323799.html
Copyright © 2011-2022 走看看