源码解析Thread.join()方法的实现原理

Oracle ERP EBS R12 GL总帐业务方案 系统操作 本文档是Oracle ERP系统的总账管理模块使用手册,主要包含以下内容:1.系统架构设计,详细介绍多组织架构、会计科目设置等核心概念;2.总账日常操作流程,包括凭证录入、审核、过账等全流程管理;3.特殊业务处理,涵盖预算控制、内部往来、合并报表等专项功能;4.期末处理,说明月结、年结的操作步骤;5.系统设置指南,提供会计科目表、权限控制等配置说明;6.附录包含各业务模块的分录示例和系统操作图标说明。本手册适用于财务人员学习和使用Oracle ERP总账系统,重点讲解系统功能要点和实操步骤。 阅读详情

直接上源码: 

join()方法的调用的例子,可以看我的上一篇博客:https://blog.youkuaiyun.com/river66/article/details/91492758

wait()方法的使用,可以看我的另一篇博客:https://blog.youkuaiyun.com/river66/article/details/90718182

private final Object lock = new Object();//线程实例的不可变对象成员
  
public final void join() throws InterruptedException {
        join(0);
} 

public final void join(long millis) throws InterruptedException {
        synchronized(lock) {//同步lock对象,获得对象锁
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            while (isAlive()) {//如果线程还没执行完
                lock.wait(0);//释放lock对象锁,程序停止执行。
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                lock.wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
        }
    }

可以看出来,join()是依靠Object的wait()方法来实现的。最重要的一句代码就是:lock.wait(0);调用t.join()的主线程,需要重新获取lock对象锁才能往下执行。

join()方法的java文档中写到:a thread terminates the  this.notifyAll method is invoked.

也就是说,t线程run()方法运行完了以后,会调用this.notifyAll,释放锁。这样主线程获得锁以后就可以继续往下执行了。

这样实现的效果就是:调用t.join(),程序会停止往下执行,知道t线程的run()方法运行完了以后,程序才会往下执行。

说明:

1、wait(0)相当于wait();

2、join()相当于join(0);

 

觉得有用的老铁们赞一下呗,谢谢!

Error response from daemon: Get “https://index.docker.io/v1/search?q=nginx&n=25“: 在使用docker seach 命令搜索镜像的时候遇到这个错误,docker pull是可以正常下载镜像的,关于这个问题,本文提供解决方案,完全可行。 阅读详情

相关推荐

线上专利申请(超详细)| 签名确认

在【法人登录】页面点击【证书登录】按钮,弹出证书登录提示框,点击【确 认】按钮,进入到输入证书密码页面,点击【取消】按钮,取消本次操作。企业在提交申请时,需要增加签名,如使用企业账户点击提交,会弹出“法人、代理机构不能签名,请使用经办人签名”,这个时候就需要换个账号了。在需要签名时,将专利官网的登录方式点击法人登录,选择扫码登录,使用移动端经办人账户的扫一扫功能扫描登录。登录完成后,再点击签名,使用移动端扫一扫功能,扫描签名,输入证书号,确认签名,并提交。最后,祝大家的申请都成功!

weixin_62112323的博客 9112

Thread类中join方法的实现原理

一.简介 join()是Thread类的一个方法,根据jdk文档的定义,join()方法的作用,是等待这个线程结束,即当前线程等待另一个调用join()方法的线程执行结束后再往下执行。通常用于在main主线程内,等待其它调用join()方法的线程执行结束再继续执行main主线程。 /** * Waits for this thread to die. * */ public final void join() throws InterruptedException 二.使用示例 通过下面两个例子,我们来看

孔繁玉的专栏 784

190、LLC谐振变换器的样机调试实战(问题定位)

这篇实战笔记总结了LLC谐振变换器样机调试中的五大典型问题及解决方案:1)空载炸机源于谐振电容纹波电流能力不足;2)轻载啸叫因控制环路不稳定,需调整突发模式阈值;3)MOSFET过热由死区时间不当导致,需精确优化实现ZVS;4)输出纹波大由PCB布局耦合引起,需优化共模抑制;5)启动过冲需延长软启动时间。作者强调调试需结合示波器、热成像仪等工具,理论计算与实测并重,并详细记录每次参数调整。文章指出LLC调试是不断试错的过程,关键是通过现象分析本质原因。

Jack010169的博客 49

(四)Thread.join的作用和原理

文章简介 很多人对Thread.join的作用以及实现了解得很少,毕竟这个api我们很少使用。这篇文章仍然会结合使用及原理进行深度分析 内容导航 Thread.join的作用 Thread.join的实现原理 什么时候会使用Thread.join Thread.join的作用 之前有人问过我一个这样的面试题 Java中如何让多线程按照...

weixin_34075551的博客 918

使用Python爬虫抓取政府网站政务信息:公告、通知的自动化抓取与分析

通过结合Requests、BeautifulSoup、Selenium等技术,你能够高效地抓取政府网站的数据,并通过MySQL存储与Pandas分析这些数据。通过自动化手段抓取这些信息,不仅可以提高数据收集的效率,还能够实时获取最新的政务动态,为政策研究、舆情分析等提供宝贵数据。我们将通过Python的Requests、BeautifulSoup、Selenium等工具,结合最新的技术实现一个完整的爬虫系统,帮助你轻松抓取并分析政务信息。通过爬虫,我们可以自动化地从指定网站上抓取公告、新闻、通知等信息。

2201_76125261的博客 1907

Qt for WebAssembly环境搭建

一、前言 二、Ubuntu 1、在线安装Qt15 在线安装下载器:https://download.qt.io/official_releases/online_installers/ 安装时记得勾选WebAssembly,如下: 2、安装依赖 # Install Python sudo apt-get install python2.7 # Install CMake (optional, only needed for tests and building Binaryen) sudo apt

贝勒里恩的博客 3670

Thread类中的join()方法原理

join()是Thread类的一个方法。根据jdk文档的定义: public final void join()throws InterruptedException: Waits for this thread to die. join()方法的作用,是等待这个线程结束;但显然,这样的定义并不清晰。个人认为”Java 7 Concurrency Cookbook”的定义较为清晰: j...

三丰的专栏 1615

RuoYi-Cloud-Plus使用minio进行文件上传图片后无法预览解决_修改minio配置minio桶权限---SpringCloud工作笔记198

在文件管理的位置,发现刚刚上传的图片文件,会显示 预览图片失败 后来经过多方查看,发现是minio的配置的问题。可以看到首先登录RuoYi-Cloud-Plus系统然后,打开文件管理页面可以看到,当上传了图片文件以后。登录以后,选中左侧Buckets,可以看到有自己用的桶,找到以后点击打开。显示文件展示中,文件预览失败,那么这个时候,去修改minio的配置。可以看到,点击配置管理,这里我们启用的是minio对吧。默认是没有配置的这个时候,是允许下载,但不允许预览的.

添柴程序猿的专栏 5569

【Java多线程】Thread.join()原理

1 前言 如果一个线程A执行了Thread.join()方法,含义是,当前线程A等待Thread线程终止之后才从Thread.join()返回。线程Thread除了Thread.join(),还有Thread.join(long millis)和Thread.join(long millis, int nanos)两个具备超时特性的方法。表示如果线程thrad在给定时间内没有终止,那么将会从超时...

奋进的小白粥 1051

【一看就会】Autoware.universe中静态绕障路线的生成逻辑

在路径行为规划中,前期根据地图和起点终点,生成了一组连续可行的路径段序列(lanelets),然后后续路径行为规划,又会进行起始点,终止点,避障绕障路径的路径规划,并且会调用route_handler中的函数,进行中心线生成,最后生成路径,后续再给速度行为规划进行速度规划。在autoware.universe的规划中,是基于规则的规划,而其中的规则又是为了解决不同场景的。而这些场景,大部分是为了解决路上障碍物(静态、动态、行人、车辆等等)。

weixin_48386130的博客 321

天龙八部TLBB系列 - 网单用数据库修改为其他门派

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等) --- 天龙八部修改门派

空名先生 9430

你真得懂Thread.join吗?

Thread类中的join方法,用于等待某个线程执行结束。 简单示例 以下简单的代码,会让主线程等待子线程执行结束再执行。如果去掉t.join(),可能主线程就直接退出了,子线程都来不及执行。 package com.qcy.testJoin; /** * @author qcy * @create 2020/09/10 17:17:03 */ public class Main { public static void main(String[] args) throws Inte

阳阳的博客 3983

训练YOLOv11 | Pytorch和Pycharm的安装教程适用W11系统(附详细的系统变量添加过程)

根据你之前下载的版本选择对应的选项即可,然后复制底下的绿色代码到Anaconda的命令行输入即可(这里要在你安装的python环境里进行安装,例如我的环境名字是PyTorch,那么就是activate PyTorch里进行安装)然后同之前一样会加载一会,然后会询问我们是否下载配件,我们输入Y等待即可(下载过程中我们要确保网络通常如果有波动可能会下载失败)。类似于我的电脑是Windows11选择上面红框内的选项即可点击后即下载,(注意这里下载的是zip文件)下载完成后复制下面几个文件。

Snu77的博客 1万+

Thread.join()方法源码分析

在JDK中Thread.join()的底层是调用了其中的 public final synchronized void join(long millis) 这个方法的,看看此方法的源码作者的英文解释: /** * Waits at most {@code millis} milliseconds for this thread to * die. A timeout of {@code 0} means to wait forever. * * <p

NessonPatrol的博客 479

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

对Thread.join的简单理解

1. join简介 join()方法是Thread类中的一个方法,该方法的定义是等待该线程终止。其实就是join()方法将挂起调用线程的执行,直到被调用的对象完成它的执行。 这句话讲的很抽象,简单来说就是父线程等待子线程结束后才能继续运行。 2. join示例 先来看一下这段简单的代码: public class test { public static void main(String[] args) throws InterruptedException { Thread thr

weixin_45668482的博客 1227

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java Thread.join()详解

Java Thread.join()详解2016年08月17日 10:32:22阅读数:7938一、使用方式。join是Thread类的一个方法,启动线程后直接调用,例如:[java] view plain copyThread t = new AThread(); t.start(); t.join();  二、为什么要用join()方法在很多情况下,主线程生成并起动了子线程,如果子线程里要...

evilcry2012的专栏 260

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

join()

t.join()方法只会使主线程(或者说调用t.join()的线程)进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。 可以看出,join()方法的底层是利用wait()方法实现的。可以看出,join方法是一个同步方法,当主线程调用t1.join()方法时,主线程先获得了t1对象的锁,随后进入方法,调用了t1对象的wait()方法,使主线程进入了t1对象的等待池,此时,A线程则还在执行,并且随后的t2.start()还没被执行,因此,B线程也还没开始。等到A线程执行完毕之后

zj20165149的博客 366

Thread类源码分析

/** Thread类源码分析 */ /** ------ 1. Thread常用属性 ------ **/ //线程名字 private volatile String name; //优先级 private int priority; //是否是守护线程 private boolean daemon = false; //将会被执行的Runnable. private Run...

weixin_38910645的博客 353

Java多线程Thread及其原理深度解析

详细讲述 Java 多线程创建方式,Thread 源码解析,Thread 常用方法源码解析,非常细节,深入到看 jdk 源码

蒋大钊的博客 1348

eclipse工具类 源码_Java并发包工具类-CountDownLatch的源码剖析

本篇文章的主要内容如下:1:举例说明CountDownLatch和Thread的join()方法2:CountDownLatch的原理剖析3:CountDownLatch的源码解析1:举例说明CountDownLatch和Thread的join()方法在实际的项目中,我们可能碰到如下的需求:A线程需要用到B线程,C线程,D线程的结果像上面的需求我们怎样利用程序去实现的。实现一:熟悉Thread类的...

weixin_42522009的博客 185

发包工具_Java并发包工具类-CountDownLatch的源码剖析

本篇文章的主要内容如下:1:举例说明CountDownLatch和Thread的join()方法2:CountDownLatch的原理剖析3:CountDownLatch的源码解析1:举例说明CountDownLatch和Thread的join()方法在实际的项目中,我们可能碰到如下的需求:A线程需要用到B线程,C线程,D线程的结果像上面的需求我们怎样利用程序去实现的。实现一:熟悉Thread类的...

weixin_34191434的博客 188

2021-10-27

thread join实现原理join源码有很多人不理解join为什么阻塞的是主线程呢?main线程被谁唤醒?伪代码来说明join的使用场景 join源码 从join方法的源码来看,join方法的本质调用的是Object中的wait方法实现线程的阻塞,调用wait方法必须要获取锁,所以join方法是被synchronized修饰的。 public final synchronized void join(long millis) throws InterruptedException {

qq_42929389的博客 332

Java线程状态切换的关键方法详解

目录 前言 一、Thread.yield() 1、JVM_Yield 2、os::yield() 3、os::sleep 二、Thread.sleep() 1、JVM_Sleep 三、Thread.join() 1、Thread.join() 四、Object.wait() 1、JVM_MonitorWait 2、ObjectSynchronizer::wait 3、Ob...

memory_nothing的专栏 1178

【JUC-1】java多线程线程基础知识

在上面的案例代码中, t.join()方法会让main方法进入wait等待. 阻塞的是main方法. 当t1线程执行完run方法逻辑后. JVM底层就会调用notify方法, 唤醒持有t1锁对象的线程.(join()方法是被synchonized修饰的, 锁对象就是线程对象)Runable/Callable接口的实现, 都是重写其中的run/call方法, 实现任务逻辑, 再由线程执行器(可以是Thread类,也可以是线程池)并发执行run/call的逻辑.JVM唤醒join源码。

干饭两斤半 297

【Java】Thread类中的join()方法原理

简介 join()是Thread类的一个方法。根据jdk文档的定义: public final void join()throws InterruptedException: Waits for this thread to die. join()方法的作用,是等待这个线程结束;但显然,这样的定义并不清晰。个人认为”Java 7 Concurrency Cookbook”的定义较为...

Mlib 2万+

JAVA多线程中join()方法的详细分析

虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客给的例子看起来都像是t.join()方法会使所有线程都暂停并等待t的执行完毕。当然,这也是因为我对多线程中的各种方法和同步的概念都理解的不是很透彻。通过看别人的分析和自己的实践之后终于想明白了,详细解释一下希望能帮助到...

今晚的月色真美 9万+
上一篇: 根据java文档全面解析Thread.yield()方法
下一篇: 可重入锁ReentrantLock和可重入读写锁ReentrantReadWriteLock
river66
博客等级 码龄8年 76粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值