Java多线程神器:join使用及原理
转载自 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使用及原理相关推荐
- Java 多线程 —— 深入理解 volatile 的原理以及应用
转载自 Java 多线程 -- 深入理解 volatile 的原理以及应用 推荐阅读:<java 多线程-线程怎么来的> 这一篇主要讲解一下volatile的原理以及应用,想必看完这一篇 ...
- 多线程的实现方式_一文搞懂Java多线程使用方式、实现原理以及常见面试题
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 夯实Java基础系列17:一文搞懂Java多线程使用方式、实现原理以及常见面试题
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 使用线程锁(lock)实现线程同步_一文搞懂Java多线程使用方式、实现原理以及常见面试题...
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 【Java】Java多线程神器:join使用及原理
1.概述 转载:http://www.javastack.cn/article/2017/java-thread-join/ join() join()是线程类Thread的方法,官方的说明是: Wa ...
- 深入学习Java多线程——并发机制底层实现原理
2019独角兽企业重金招聘Python工程师标准>>> Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执 ...
- JAVA多线程中join()方法的详细分析
虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客给的例子看起来都像 ...
- Java多线程中join方法详解
join()方法用于让当前执行线程等待join线程执行结束.其实现原理是不停的检查join线程是否存活,如果join线程存活则让当前线程永远等待. join()方法部分实现细节 while(isAli ...
- Java多线程(3) Volatile的实现原理
Volatile变量 在程序设计中,尤其是在C语言.C++.C#和Java语言中,使用volatile关键字声明的变量或对象通常拥有和优化和(或)多线程相关的特殊属性.通常,volatile关键字用来 ...
最新文章
- GO语言教程3:杂类
- PYG教程【五】链路预测
- IOS研究之App转让流程须知具体介绍
- MeasureSpec学习
- LeetCode每日一题——串联字符串的最大长度
- 中国智能手机行业的江湖事
- 这12个GIS软件一个比一个好用
- 成都哪所专科院校有计算机专业,成都哪些高职院校有计算机应用技术
- koa2异常处理_【HAVENT原创】KOA2 异常处理
- linux技术发展方向,linux技术的发展方向有哪些?Linux运维入门
- 电脑如何录制屏幕视频?介绍三个电脑录屏的小技巧
- 海外引流怎么做?巨象指纹浏览器助你,人人都是产品经理
- [NodeJS] Mongoose Populate 基本使用
- matlab三相异步电动机仿真,三相异步电动机的MATLAB仿真研究
- 如何解决“由于无法验证发行者,所以WINDOWS已经阻止此软件”
- Ordinal numeral
- 把Windows资源管理器结束任务了,电脑黑屏的解决方案
- 英语练习32 Poor Amy
- 调试笔记之雨过天晴多点还原软件MBR实例
- 天池数据集|精品数据集推荐(工业篇)
热门文章
- [SpringBoot2]拦截器
- [蓝桥杯2017初赛]纸牌三角形-枚举permutation+数论
- mysql边备份边导入么_MySQL 怎么导入导出操作
- CoreJava 笔记总结-第十二章 并发-2
- leetcode 二进制求和 addBinary
- Educational Codeforces Round 75 (Rated for Div. 2) E2. Voting (Hard Version) 贪心
- 2021HDU多校第五场1004 Another String-双指针
- P4245 【模板】任意模数多项式乘法(NTT)
- Acwing1086. 恨7不成妻(未解决)
- 【每日一题】7月1日题目精讲 借教室