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() ② ...
最新文章
- GUI_Download的Codepage参数
- WatchDog工作原理
- java 秒杀多线程_秒杀多线程系列 - 随笔分类 - Joyfulmath - 博客园
- poj 1236 Network of Schools (强连通分支缩点)
- Redis学习总结(9)——Redis常见面试题汇总
- 巧用“搜索”解决自学编程遇到的难题
- OpenCV3.4 sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA' : undeclared
- 拉格朗日/循环群的子群都是子群
- DNS服务双解析邮箱地址
- DBeaver——一款替代Navicat的数据库可视化工具
- JVM中的monitor
- Struts2基础教程
- FPGA控制_步进电机模块使用说明
- Windows7开机加速全攻略五:系统服务优化
- linux授权文件夹777,服务器上如何修改文件夹777权限
- Java算法之 循序搜寻法
- U8固定资产最重要的数据表
- cat6 万兆_干货:CAT5E超五类、CAT6和CAT6A超六类布线系统性能和应用上的区别
- Unity3D插件 Doozy UI 学习(三):UI Element
- c语言软件如何调字间距,sublime text2如何更改行间距和字符间距?
热门文章
- beego mysql增删改查_5-BeegoORM增删改查-Go语言中文社区
- mysql5.7 keepalived_基于MySQL 5.7多源复制及Keepalived搭建三节点高可用架构
- mplab java失败_【超菜鸟求助】编译时失败,以下是显示内容。
- c语言随机数加密,TC伪随机数加密解决方法
- 不能忽视的情绪 -- 喜怒哀惧,也不过度关注
- 容器技术Docker K8s 2 云原生容器技术概述
- 阿里云云计算 26 SLB的配置
- 算法:Design Circular Deque(设计一个双端队列)
- Wide Deep 模型详解
- 468.验证IP地址