【Java】Java多线程神器:join使用及原理
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使用及原理相关推荐
- Java多线程神器:join使用及原理
转载自 Java多线程神器:join使用及原理 join() join()是线程类 Thread的方法,官方的说明是: Waits for this thread to die. 等待这个线程结束,也 ...
- 多线程的实现方式_一文搞懂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 多线程 —— 深入理解 volatile 的原理以及应用
转载自 Java 多线程 -- 深入理解 volatile 的原理以及应用 推荐阅读:<java 多线程-线程怎么来的> 这一篇主要讲解一下volatile的原理以及应用,想必看完这一篇 ...
- 第十章 进程间的通信 之 Java/Android多线程开发(二)
文章目录 (一)Java 多线程开发 1.1)线程状态 1.2)线程控制方法 (1.2.1)Synchronized (1.2.2)Volatile (1.2.3)ReentrantLock 1.3) ...
- Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)
一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...
- Java面试通关神器,冲鸭,进大厂!
Java面试通关神器:涵盖Java+分布式+框架+数据库+Redis缓存+线程等 该内容包含了入门级 Java 程序员和多年经验的高级开发者的问题.无论你是 1.2.3.4.5.6.7.8.9 还是 ...
- Java并发指南17:Java常见多线程面试题及答案
Java多线程面试题及答案(2020版) 前言 个人珍藏的80道Java多线程/并发经典面试题,因为篇幅太长,现在先给出1-10的答案解析哈,后面一起完善~ 1. synchronized的实现原理以 ...
- Java 并发 (13) -- Fork/Join 框架
文章目录 1. 简介 2. 精讲 1. 什么是 Fork/Join 框架 2. 工作窃取算法 3. Fork/Join 框架的设计 4. 使用 Fork/Join 框架 5. Fork/Join 框架 ...
最新文章
- 时间复杂度为on的排序算法_排序算法amp;时间复杂度计算
- [Redis]c# redis缓存辅助类
- Oracle数据库创建表空间
- 产品研发过程管理专题——编写软件测试计划需要考虑的几个问题
- Web前端面试指导(十七):一个满屏 品 字布局 如何设计?
- chmod命令的用法
- 深入理解Nginx——链接
- 我在51CTO微职位学PMP_飘过攻略及心得分享
- U盘检测及量产工具大合集
- linux 触屏校准命令,tslib-触摸屏校准
- [Irving]Android 常用布局之RelativeLayout
- 计算机体系结构:记分牌算法(完全弄懂!)
- greatest least 函数
- php手册3.1,thinkphp3.1手册下载|
- 解决:Activiti7与SpringBoot整合时,默认生成的activiti数据库中只有17张表,无另外8张历史表
- git命令判断当前分支是否与master合并
- Html设置网页背景图片
- Linux命令之输出文件尾部内容tail
- Linux下安装libgdal库,libjpeg库和libtiff库
- php 炸金花牌型 和 比牌 规则
热门文章
- 苹果神秘新iPhone首曝光,外形终于无槽点了!
- 马斯克自曝曾寻求苹果600亿美元收购特斯拉 但库克拒绝会面
- 90万餐饮商家全店五折 支付宝首次以数字生活平台身份参加双11
- B站获得英雄联盟赛事直播三年独播版权
- 价值12万汽车网上售价1万?老哥拍下后4S店不认账:标错价了
- 5G商用将满一年,6G研发开始了...
- 二代征信系统上线 这些内容与你有关
- 第四代双模5G旗舰:vivo X30系列为啥「超有梗」?
- 王思聪连收3条限制消费令后,债主回应:对于他是小钱,对于我们可是巨款
- 疑似锤子新机谍照曝光,后置“拐角”四摄,前CEO犀利点评...