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的作用就是主线程等待子线程执行完毕了,把活干完了,主线程才能拿着子线程执行完后的完整数据去继续执行(干活)。
  • 相关阅读:
    《Effective Java》读书笔记
    《Effective Java》读书笔记
    《Effective Java》读书笔记
    使用 @Log4j2 log.error() 打印异常日志
    获取min-max之间的随机数
    跨域问题(CORS / Access-Control-Allow-Origin)
    SnowFlakeId 分布式雪花id算法
    订单入库后异步推送
    查看git HEAD
    Java Http POST/GET 情求
  • 原文地址:https://www.cnblogs.com/gougou1981/p/12323799.html
Copyright © 2011-2022 走看看