java多线程join()方法原理详解
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()方法原理详解相关推荐
- 【Java基础】HashMap原理详解
[Java基础]HashMap原理详解 HashMap的实现 1. 数组 2.线性链表 3.红黑树 3.1概述 3.2性质 4.HashMap扩容死锁 5. BATJ一线大厂技术栈 HashMap的实 ...
- Java多线程之线程池详解
Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...
- Java HashSet的实现原理详解
HashSet是Java Map类型的集合类中最常使用的,本文基于Java1.8,对于HashSet的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.com/ja ...
- Java HashMap的实现原理详解
HashMap是Java Map类型的集合类中最常使用的,本文基于Java1.8,对于HashMap的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.com/ja ...
- Java LinkedList的实现原理详解
LinkedList是Java List类型的集合类的一种实现,此外,LinkedList还实现了Deque接口.本文基于Java1.8,对于LinkedList的实现原理做一下详细讲解. (Java ...
- Java ArrayList的实现原理详解
ArrayList是Java List类型的集合类中最常使用的,本文基于Java1.8,对于ArrayList的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.c ...
- Java进制转换原理详解
在使用Java进行网络编程时,常常需要进行进制转换,而在进行这类操作时,往往需要对进制与Java数据类型有较深入的理解,才能确保在编程时不会出现错误.同时,深入了解进制能写出更加高效的代码. 本文先从 ...
- Java中getBytes()方法--使用详解
getBytes()方法详解 在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这表示在不同的操作系统下,返回的东西不一样! 1. str.getByte ...
- java生成pdf方法_详解Java生成PDF文档方法|chu
最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持iText,生成PDF文档,还支持将XML ...
- 【java】java多线程及线程池详解
目录 前言 线程是什么?多线程是什么? 多线程的作用和好处以及缺点 守护线程和用户线程 并发和并行的区别 一.线程的状态和常用方法 1.线程各种状态转化图 2.线程相关常用方法有 ① wait() ② ...
最新文章
- PDF文字怎么编辑,PDF文档编辑方法
- openlayers 可以实现3d地图效果吗_OpenLayers教程:地图标注
- base64编码 springboot_Spring Boot 中如何实现 HTTP 认证?
- Visual C++利用互斥量同步线程实现文件读取进度条
- 5G对人体危害很大?张朝阳回应:并未做过深入研究
- 鸿蒙系统 塞班,华为鸿蒙系统来了:安卓系统会成为下一个“塞班”吗?
- 5ecsgo启动失败2错误代码2_Xcode 10.2 编译失败,如何对敌?
- k2路由器linux系统,【路由器】斐讯K1/K2刷专版潘多拉固件以及教程
- Java降落伞_使用DJI Onboard SDK进行降落伞部署
- ENVI实验教程(3)遥感图像预处理—几何校正
- 网站的海量数据和高并发的解决方案(二)
- matlab获取2的整数次幂,如何快速判断正整数是2的N次幂
- HUAWEI华为MateBook13 2020锐龙版R5集显16G+512GB(HNL-WFQ9)原装出厂系统恢复原厂系统
- VIVADO中IO管脚分配 IO PLANING
- 计算机科学权威年会,2017年全国理论计算机科学学术年会在我校召开
- 【已完结】【悲报】pip search 报错
- 谷歌浏览器记住密码功能 input框黄色背景
- C语言小程序——数的重组
- 数据可视化工具选型指南
- EXCEL点击一次,数值自动加一