join()

在线程中调用另一个线程的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;}}
}

不要在意源码细节,
可以看出的join()原理,即 使用wait()方法;
注意,join()方法被synchronized修饰,锁为this(当前真正运行的线程),能够执行join()方法的线程是已经获到锁并处于运行态,当运行到wait()时,线程由运行态转化为阻塞态 并释放锁;

有了wait(),必然有notify()
https://blog.csdn.net/u010983881/article/details/80257703

void JavaThread::exit(bool destroy_vm, ExitType exit_type) {// ...// 就是这行ensure_join(this);// ...
}static void ensure_join(JavaThread* thread) {//...// thread就是当前线程,就是刚才例子中说的this线程。lock.notify_all(thread);//...
}

使用例子

public class JoinExample {static class A extends Thread {@Overridepublic void run() {System.out.println("A");}}static class B extends Thread {private A a;B(A a) {this.a = a;}@Overridepublic void run() {try {a.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("B");}}
}
public static void main(String[] args) {A a = new A();B b = new B(a);b.start();a.start();}

A、B线程同时运行,在B线程中调用A线程的join方法,会使B线程阻塞,直到A线程运行完才接直运行

A
B

java多线程join()方法原理详解相关推荐

  1. 【Java基础】HashMap原理详解

    [Java基础]HashMap原理详解 HashMap的实现 1. 数组 2.线性链表 3.红黑树 3.1概述 3.2性质 4.HashMap扩容死锁 5. BATJ一线大厂技术栈 HashMap的实 ...

  2. Java多线程之线程池详解

    Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...

  3. Java HashSet的实现原理详解

    HashSet是Java Map类型的集合类中最常使用的,本文基于Java1.8,对于HashSet的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.com/ja ...

  4. Java HashMap的实现原理详解

    HashMap是Java Map类型的集合类中最常使用的,本文基于Java1.8,对于HashMap的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.com/ja ...

  5. Java LinkedList的实现原理详解

    LinkedList是Java List类型的集合类的一种实现,此外,LinkedList还实现了Deque接口.本文基于Java1.8,对于LinkedList的实现原理做一下详细讲解. (Java ...

  6. Java ArrayList的实现原理详解

    ArrayList是Java List类型的集合类中最常使用的,本文基于Java1.8,对于ArrayList的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.c ...

  7. Java进制转换原理详解

    在使用Java进行网络编程时,常常需要进行进制转换,而在进行这类操作时,往往需要对进制与Java数据类型有较深入的理解,才能确保在编程时不会出现错误.同时,深入了解进制能写出更加高效的代码. 本文先从 ...

  8. Java中getBytes()方法--使用详解

    getBytes()方法详解 在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这表示在不同的操作系统下,返回的东西不一样! 1. str.getByte ...

  9. java生成pdf方法_详解Java生成PDF文档方法|chu

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持iText,生成PDF文档,还支持将XML ...

  10. 【java】java多线程及线程池详解

    目录 前言 线程是什么?多线程是什么? 多线程的作用和好处以及缺点 守护线程和用户线程 并发和并行的区别 一.线程的状态和常用方法 1.线程各种状态转化图 2.线程相关常用方法有 ① wait() ② ...

最新文章

  1. PDF文字怎么编辑,PDF文档编辑方法
  2. openlayers 可以实现3d地图效果吗_OpenLayers教程:地图标注
  3. base64编码 springboot_Spring Boot 中如何实现 HTTP 认证?
  4. Visual C++利用互斥量同步线程实现文件读取进度条
  5. 5G对人体危害很大?张朝阳回应:并未做过深入研究
  6. 鸿蒙系统 塞班,华为鸿蒙系统来了:安卓系统会成为下一个“塞班”吗?
  7. 5ecsgo启动失败2错误代码2_Xcode 10.2 编译失败,如何对敌?
  8. k2路由器linux系统,【路由器】斐讯K1/K2刷专版潘多拉固件以及教程
  9. Java降落伞_使用DJI Onboard SDK进行降落伞部署
  10. ENVI实验教程(3)遥感图像预处理—几何校正
  11. 网站的海量数据和高并发的解决方案(二)
  12. matlab获取2的整数次幂,如何快速判断正整数是2的N次幂
  13. HUAWEI华为MateBook13 2020锐龙版R5集显16G+512GB(HNL-WFQ9)原装出厂系统恢复原厂系统
  14. VIVADO中IO管脚分配 IO PLANING
  15. 计算机科学权威年会,2017年全国理论计算机科学学术年会在我校召开
  16. 【已完结】【悲报】pip search 报错
  17. 谷歌浏览器记住密码功能 input框黄色背景
  18. C语言小程序——数的重组
  19. 数据可视化工具选型指南
  20. EXCEL点击一次,数值自动加一

热门文章

  1. 产品经理训练营:让正确的事情相继发生 开营直播
  2. 翻译:控制容器的反转IoC和依赖注入模式DIP 概念发源地 Martin Fowler
  3. Sublime 3 打开GBK 编码文件中文乱码 解决办法
  4. AppStore图片尺寸以及内容要求Screenshot specifications
  5. 计算机检索系统中 每一种文献特征,自考《档案文献检索》串讲资料(1)
  6. linux运行彩虹猫,如何在在 Linux 命令行中观看彩虹猫
  7. pdf 目录导入 macos
  8. POJ - 3233 —— 矩阵快速幂(分块矩阵与递归)
  9. Idea修改项目的包名
  10. webdriver原理