转载自 Java多线程神器: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多线程神器:join使用及原理相关推荐

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

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

  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】Java多线程神器:join使用及原理

    1.概述 转载:http://www.javastack.cn/article/2017/java-thread-join/ join() join()是线程类Thread的方法,官方的说明是: Wa ...

  6. 深入学习Java多线程——并发机制底层实现原理

    2019独角兽企业重金招聘Python工程师标准>>> Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执 ...

  7. JAVA多线程中join()方法的详细分析

    虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客给的例子看起来都像 ...

  8. Java多线程中join方法详解

    join()方法用于让当前执行线程等待join线程执行结束.其实现原理是不停的检查join线程是否存活,如果join线程存活则让当前线程永远等待. join()方法部分实现细节 while(isAli ...

  9. Java多线程(3) Volatile的实现原理

    Volatile变量 在程序设计中,尤其是在C语言.C++.C#和Java语言中,使用volatile关键字声明的变量或对象通常拥有和优化和(或)多线程相关的特殊属性.通常,volatile关键字用来 ...

最新文章

  1. GO语言教程3:杂类
  2. PYG教程【五】链路预测
  3. IOS研究之App转让流程须知具体介绍
  4. MeasureSpec学习
  5. LeetCode每日一题——串联字符串的最大长度
  6. 中国智能手机行业的江湖事
  7. 这12个GIS软件一个比一个好用
  8. 成都哪所专科院校有计算机专业,成都哪些高职院校有计算机应用技术
  9. koa2异常处理_【HAVENT原创】KOA2 异常处理
  10. linux技术发展方向,linux技术的发展方向有哪些?Linux运维入门
  11. 电脑如何录制屏幕视频?介绍三个电脑录屏的小技巧
  12. 海外引流怎么做?巨象指纹浏览器助你,人人都是产品经理
  13. [NodeJS] Mongoose Populate 基本使用
  14. matlab三相异步电动机仿真,三相异步电动机的MATLAB仿真研究
  15. 如何解决“由于无法验证发行者,所以WINDOWS已经阻止此软件”
  16. Ordinal numeral
  17. 把Windows资源管理器结束任务了,电脑黑屏的解决方案
  18. 英语练习32 Poor Amy
  19. 调试笔记之雨过天晴多点还原软件MBR实例
  20. 天池数据集|精品数据集推荐(工业篇)

热门文章

  1. [SpringBoot2]拦截器
  2. [蓝桥杯2017初赛]纸牌三角形-枚举permutation+数论
  3. mysql边备份边导入么_MySQL 怎么导入导出操作
  4. CoreJava 笔记总结-第十二章 并发-2
  5. leetcode 二进制求和 addBinary
  6. Educational Codeforces Round 75 (Rated for Div. 2) E2. Voting (Hard Version) 贪心
  7. 2021HDU多校第五场1004 Another String-双指针
  8. P4245 【模板】任意模数多项式乘法(NTT)
  9. Acwing1086. 恨7不成妻(未解决)
  10. 【每日一题】7月1日题目精讲 借教室