1.概述

转载:http://www.javastack.cn/article/2017/java-thread-join/

join()

join()是线程类Thread的方法,官方的说明是:

Waits for this thread to die.

等待这个线程结束,也就是说当前线程等待这个线程结束后再继续执行,下面来看这个示例就明白了。

示例

public static void main(String[] args) throws Exception {System.out.println("start");Thread t = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println(i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();t.join();System.out.println("end");
}

结果输出:

start
0
1
2
3
4
end

线程t开始后,接着加入t.join()方法,t线程里面程序在主线程end输出之前全部执行完了,说明t.join()阻塞了主线程直到t线程执行完毕。

如果没有t.join(),end可能会在0~5之间输出。

join()原理

下面是join()的源码:

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;}}
}

可以看出它是利用wait方法来实现的,上面的例子当main方法主线程调用线程t的时候,main方法获取到了t的对象锁,而t调用自身wait方法进行阻塞,只要当t结束或者到时间后才会退出,接着唤醒主线程继续执行。millis为主线程等待t线程最长执行多久,0为永久直到t线程执行结束。

【Java】Java多线程神器:join使用及原理相关推荐

  1. Java多线程神器:join使用及原理

    转载自 Java多线程神器:join使用及原理 join() join()是线程类 Thread的方法,官方的说明是: Waits for this thread to die. 等待这个线程结束,也 ...

  2. 多线程的实现方式_一文搞懂Java多线程使用方式、实现原理以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  3. 夯实Java基础系列17:一文搞懂Java多线程使用方式、实现原理以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  4. 使用线程锁(lock)实现线程同步_一文搞懂Java多线程使用方式、实现原理以及常见面试题...

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  5. Java 多线程 —— 深入理解 volatile 的原理以及应用

    转载自  Java 多线程 -- 深入理解 volatile 的原理以及应用 推荐阅读:<java 多线程-线程怎么来的> 这一篇主要讲解一下volatile的原理以及应用,想必看完这一篇 ...

  6. 第十章 进程间的通信 之 Java/Android多线程开发(二)

    文章目录 (一)Java 多线程开发 1.1)线程状态 1.2)线程控制方法 (1.2.1)Synchronized (1.2.2)Volatile (1.2.3)ReentrantLock 1.3) ...

  7. Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  8. Java面试通关神器,冲鸭,进大厂!

    Java面试通关神器:涵盖Java+分布式+框架+数据库+Redis缓存+线程等 该内容包含了入门级 Java 程序员和多年经验的高级开发者的问题.无论你是 1.2.3.4.5.6.7.8.9 还是 ...

  9. Java并发指南17:Java常见多线程面试题及答案

    Java多线程面试题及答案(2020版) 前言 个人珍藏的80道Java多线程/并发经典面试题,因为篇幅太长,现在先给出1-10的答案解析哈,后面一起完善~ 1. synchronized的实现原理以 ...

  10. Java 并发 (13) -- Fork/Join 框架

    文章目录 1. 简介 2. 精讲 1. 什么是 Fork/Join 框架 2. 工作窃取算法 3. Fork/Join 框架的设计 4. 使用 Fork/Join 框架 5. Fork/Join 框架 ...

最新文章

  1. 时间复杂度为on的排序算法_排序算法amp;时间复杂度计算
  2. [Redis]c# redis缓存辅助类
  3. Oracle数据库创建表空间
  4. 产品研发过程管理专题——编写软件测试计划需要考虑的几个问题
  5. Web前端面试指导(十七):一个满屏 品 字布局 如何设计?
  6. chmod命令的用法
  7. 深入理解Nginx——链接
  8. 我在51CTO微职位学PMP_飘过攻略及心得分享
  9. U盘检测及量产工具大合集
  10. linux 触屏校准命令,tslib-触摸屏校准
  11. [Irving]Android 常用布局之RelativeLayout
  12. 计算机体系结构:记分牌算法(完全弄懂!)
  13. greatest least 函数
  14. php手册3.1,thinkphp3.1手册下载|
  15. 解决:Activiti7与SpringBoot整合时,默认生成的activiti数据库中只有17张表,无另外8张历史表
  16. git命令判断当前分支是否与master合并
  17. Html设置网页背景图片
  18. Linux命令之输出文件尾部内容tail
  19. Linux下安装libgdal库,libjpeg库和libtiff库
  20. php 炸金花牌型 和 比牌 规则

热门文章

  1. 苹果神秘新iPhone首曝光,外形终于无槽点了!
  2. 马斯克自曝曾寻求苹果600亿美元收购特斯拉 但库克拒绝会面
  3. 90万餐饮商家全店五折 支付宝首次以数字生活平台身份参加双11
  4. B站获得英雄联盟赛事直播三年独播版权
  5. 价值12万汽车网上售价1万?老哥拍下后4S店不认账:标错价了
  6. 5G商用将满一年,6G研发开始了...
  7. 二代征信系统上线 这些内容与你有关
  8. 第四代双模5G旗舰:vivo X30系列为啥「超有梗」?
  9. 王思聪连收3条限制消费令后,债主回应:对于他是小钱,对于我们可是巨款
  10. 疑似锤子新机谍照曝光,后置“拐角”四摄,前CEO犀利点评...