全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java线程之join_动力节点Java学院整理

join()介绍

join() 定义在Thread.java中。

join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行。这句话可能有点晦涩,我们还是通过例子去理解: 

// 主线程
public class Father extends Thread {
  public void run() {
    Son s = new Son();
    s.start();
    s.join();
    ...
  }
}
// 子线程
public class Son extends Thread {
  public void run() {
    ...
  }
}

说明:

上面的有两个类Father(主线程类)和Son(子线程类)。因为Son是在Father中创建并启动的,所以,Father是主线程类,Son是子线程类。

在Father主线程中,通过new Son()新建“子线程s”。接着通过s.start()启动“子线程s”,并且调用s.join()。在调用s.join()之后,Father主线程会一直等待,直到“子线程s”运行完毕;在“子线程s”运行完毕之后,Father主线程才能接着运行。 这也就是我们所说的“join()的作用,是让主线程会等待子线程结束之后才能继续运行”! 

 join()源码分析(基于JDK1.7.0_40) 

public final void join() throws InterruptedException {
  join(0);
}
public final synchronized void join(long millis)
throws InterruptedException {
  long base = System.currentTimeMillis();
  long now = 0;
  if (millis < 0) {
    throw new IllegalArgumentException("timeout value is negative");
  }
  if (millis == 0) {
    while (isAlive()) {
      wait(0);
    }
  } else {
    while (isAlive()) {
      long delay = millis - now;
      if (delay <= 0) {
        break;
      }
      wait(delay);
      now = System.currentTimeMillis() - base;
    }
  }
}

说明:

从代码中,我们可以发现。当millis==0时,会进入while(isAlive())循环;即只要子线程是活的,主线程就不停的等待。

我们根据上面解释join()作用时的代码来理解join()的用法!

问题:

虽然s.join()被调用的地方是发生在“Father主线程”中,但是s.join()是通过“子线程s”去调用的join()。那么,join()方法中的isAlive()应该是判断“子线程s”是不是Alive状态;对应的wait(0)也应该是“让子线程s”等待才对。但如果是这样的话,s.join()的作用怎么可能是“让主线程等待,直到子线程s完成为止”呢,应该是让"子线程等待才对(因为调用子线程对象s的wait方法嘛)"?

答案:wait()的作用是让“当前线程”等待,而这里的“当前线程”是指当前在CPU上运行的线程。所以,虽然是调用子线程的wait()方法,但是它是通过“主线程”去调用的;所以,休眠的是主线程,而不是“子线程”! 

join()示例

在理解join()的作用之后,接下来通过示例查看join()的用法。 

// JoinTest.java的源码
public class JoinTest{ 
  public static void main(String[] args){ 
    try {
      ThreadA t1 = new ThreadA("t1"); // 新建“线程t1”
      t1.start();           // 启动“线程t1”
      t1.join();            // 将“线程t1”加入到“主线程main”中,并且“主线程main()会等待它的完成”
      System.out.printf("%s finish\n", Thread.currentThread().getName()); 
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  } 
  static class ThreadA extends Thread{
    public ThreadA(String name){ 
      super(name); 
    } 
    public void run(){ 
      System.out.printf("%s start\n", this.getName()); 
      // 延时操作
      for(int i=0; i <1000000; i++)
        ;
      System.out.printf("%s finish\n", this.getName()); 
    } 
  } 
}

运行结果:

t1 start
t1 finish
main finish

结果说明:

运行流程如图

(01) 在“主线程main”中通过 new ThreadA("t1") 新建“线程t1”。 接着,通过 t1.start() 启动“线程t1”,并执行t1.join()。

(02) 执行t1.join()之后,“主线程main”会进入“阻塞状态”等待t1运行结束。“子线程t1”结束之后,会唤醒“主线程main”,“主线程”重新获取cpu执行权,继续运行。

 以上所述是小编给大家介绍的Java线程之join_动力节点Java学院整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# java  # 线程  # join  # java基本教程之join方法详解 java多线程教程  # Java线程编程中isAlive()和join()的使用详解  # Java join 线程控制用法  # Java多线程ForkJoinPool实例详解  # java多线程编程之join方法的使用示例  # Java多线程中关于join方法的使用实例解析  # Java使用join方法暂停当前线程  # 浅谈Java线程Thread.join方法解析  # 浅谈java多线程 join方法以及优先级方法  # 浅谈java线程join方法使用方法  # java 线程方法join简单用法实例总结  # 结束之后  # 才对  # 小编  # 的是  # 应该是  # 是在  # 在此  # 是这样  # 是指  # 它是  # 这句话  # 我们可以  # 这也  # 给大家  # 如图  # 也应  # 所述  # 给我留言  # 感谢大家  # 而不是 


相关文章: C#怎么创建控制台应用 C# Console App项目创建方法  青浦网站制作公司有哪些,苹果官网发货地是哪里?  怀化网站制作公司,怀化新生儿上户网上办理流程?  如何在阿里云购买域名并搭建网站?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  建站之星客服服务时间及联系方式如何?  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  南宁网站建设制作定制,南宁网站建设可以定制吗?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  如何在云主机上快速搭建多站点网站?  如何用景安虚拟主机手机版绑定域名建站?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  如何基于云服务器快速搭建网站及云盘系统?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  网站制作话术技巧,网站推广做的好怎么话术?  广州营销型建站服务商推荐:技术优势与SEO优化解析  如何通过主机屋免费建站教程十分钟搭建网站?  淘宝制作网站有哪些,淘宝网官网主页?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  如何快速启动建站代理加盟业务?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  建站之星免费版是否永久可用?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  学校建站服务器如何选型才能满足性能需求?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  已有域名和空间,如何快速搭建网站?  建站主机默认首页配置指南:核心功能与访问路径优化  清除minerd进程的简单方法  在线教育网站制作平台,山西立德教育官网?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  常州自助建站费用包含哪些项目?  建站之星展会模板:智能建站与自助搭建高效解决方案  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  微课制作网站有哪些,微课网怎么进?  如何通过多用户协作模板快速搭建高效企业网站?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  如何在阿里云高效完成企业建站全流程?  如何用低价快速搭建高质量网站?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  视频网站app制作软件,有什么好的视频聊天网站或者软件?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。