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. GUI_Download的Codepage参数
  2. WatchDog工作原理
  3. java 秒杀多线程_秒杀多线程系列 - 随笔分类 - Joyfulmath - 博客园
  4. poj 1236 Network of Schools (强连通分支缩点)
  5. Redis学习总结(9)——Redis常见面试题汇总
  6. 巧用“搜索”解决自学编程遇到的难题
  7. OpenCV3.4 sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA' : undeclared
  8. 拉格朗日/循环群的子群都是子群
  9. DNS服务双解析邮箱地址
  10. DBeaver——一款替代Navicat的数据库可视化工具
  11. JVM中的monitor
  12. Struts2基础教程
  13. FPGA控制_步进电机模块使用说明
  14. Windows7开机加速全攻略五:系统服务优化
  15. linux授权文件夹777,服务器上如何修改文件夹777权限
  16. Java算法之 循序搜寻法
  17. U8固定资产最重要的数据表
  18. cat6 万兆_干货:CAT5E超五类、CAT6和CAT6A超六类布线系统性能和应用上的区别
  19. Unity3D插件 Doozy UI 学习(三):UI Element
  20. c语言软件如何调字间距,sublime text2如何更改行间距和字符间距?

热门文章

  1. beego mysql增删改查_5-BeegoORM增删改查-Go语言中文社区
  2. mysql5.7 keepalived_基于MySQL 5.7多源复制及Keepalived搭建三节点高可用架构
  3. mplab java失败_【超菜鸟求助】编译时失败,以下是显示内容。
  4. c语言随机数加密,TC伪随机数加密解决方法
  5. 不能忽视的情绪 -- 喜怒哀惧,也不过度关注
  6. 容器技术Docker K8s 2 云原生容器技术概述
  7. 阿里云云计算 26 SLB的配置
  8. 算法:Design Circular Deque(设计一个双端队列)
  9. Wide Deep 模型详解
  10. 468.验证IP地址