Java并发之Thread.join()

Java并发编程-线程间通信-volatile和synchronized关键字、等待/通知机制、管道输入/输出流、Thread.join()的使用、ThreadLocal的使用 阅读详情
前言:刚刚开始学习多线程的Thread的时候就知道了join这个方法,一直对它只是懵懂的认知。Waits for this thread to die是这个方法的作用。
  1. 看一个例子
public class SynchronizedClassClass 
        implements Runnable{

    static SynchronizedClassClass synchronizedObjectCodeBlock1 
            = new SynchronizedClassClass();
    static int i = 0;

    public static void main(String[] args) {
        Thread t1 = new Thread(synchronizedObjectCodeBlock1);
        t1.start();
        try {
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(i);
    }

    @Override
    public void run() {
        method();
    }

    public void method(){
        synchronized (SynchronizedClassClass.class){
            for (int j = 0; j < 100000; j++) {
                i++;
            }
        }
    }
}

当调用了t1.join()方法之后结果返回的值一定是100000,如果没有调用返回的值就是随机的,这个就可以得出线程调用join方法之后,该方法后的方法会等待线程执行完之后再执行后续的代码,对于当前的类就是等t1线程执行完run方法中的所有的代码后才会执行输出的动作
2. 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;
            }
        }
    }
    public final synchronized void join(long millis, int nanos)
    throws InterruptedException {
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }
        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }
        if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
            millis++;
        }
        join(millis);
    }
	public final void join() throws InterruptedException {
        join(0);
    }

通过查看源码可以知道join()和join(long millis, int nanos)最终都是调用join(long millis),对于join(long millis)来说中间的逻辑就是如果给定的等待时间是0的话,表示主线程永远的等待,直到子线程执行完毕。至于t1.join()为什么不是子线程的暂停等待,而是主线程,借用大神的理解是调用的join()然后调用了wait方法其中wait是Object类的方法,把对象t1当成是一个普通的对象,调用wait方法是让调用方法的线程挂起,和调用的是哪个对象上的wait方法没关系。

java基本教程之join方法详解 java多线程教程 本文对java Thread中join()方法进行介绍,join()的作用是让“主线程”等待“子线程”结束之后才能继续运行,大家参考使用吧 立即下载

相关推荐

仿真每日一练 | Workbench下薄板疲劳分析

今天给大家介绍Workbench下薄板疲劳分析,采用稳态分析模块进行评估。完成求解后,插入疲劳工具,同时插入对应的寿命进行查看,如图7和图8所示。采用稳态分析模块,导入几何模型,效果如图1。添加固定约束与扭矩,同时添加转速如图4所示。主要包括7要素,对应的类型见图2。求解完成后查看应力,如图6所示。1-1-3、有限元系统模型构建。1-2-1、加载条件/边界条件。1-1-1、几何模型构建。1-1-2、材料定义。1-2-2、求解设置。1-3-1、查看结果。1-3-2、评估结果。1-3-3、修正结果。

ansysxuexizhe的博客 1071

Java Thread中的join()方法解释

Join作用 join是定义在Thread类中的方法,作用是阻塞当前线程的执行,等到被调用join的线程对象执行完毕才执行继续执行当前线程。在Java源码中的定义如下: public final void join() throws InterruptedException { join(0); } public final synchronized void join(long millis) throws InterruptedException 接下来我们先来看看join的简单使用,这样能

wenhonglian的博客 8866

AURIX TC397开发板到手第一步:用iLLD库驱动LED流水灯(附完整代码)

本文详细介绍了如何使用英飞凌AURIX TC397开发板和iLLD库实现LED流水灯效果。从开发环境配置到硬件连接,再到完整的代码实现,逐步引导开发者完成项目。文章还提供了优化建议和常见问题解决方案,帮助嵌入式开发新手快速上手。

weixin_30911451的博客 390

Java多线程join()方法

Java多线程join()方法

weixin_54963748的博客 3682

Linux之SUSE系统SAP-HANA经常系统内存不足使得SAP应用不能使用解决方案

问题描述 Linux内存使用量超过阈值,使得sap应用程序无可用内存,最终导致程序崩溃。 问题原因 自己查阅了一些资料,也基于zabbix的可用内存和实际不太一样入手去找原因发现问题出现于Cached的值过大,导致系统没有可以再分配的内存空间。Cached只要用来缓存文件的,经常读写的文件会被缓存到Cached中,可以增加读写效率,该功能是Linux系统内核提供的,而SAP-HANA的日志文件很大...

liuxiangyang_的博客 6709

【CubeMX】STM32G474 HRTIM 死区时间与互补PWM实战解析

本文深入解析STM32G474的HRTIM高分辨率定时器在互补PWM生成与死区时间配置中的应用。通过CubeMX工具详细演示时钟配置、单路PWM基础、互补输出与死区时间设置,并结合逆变器等电力电子实战案例,帮助开发者避免直通风险,优化系统性能。

efc12345678的博客 746

Thread 的 join() 方法

关于 Thread 的 join 方法 1、join() 方法说明2、代码演示2.1 添加 join() 方法后2.2 添加 join() 方法前2.3 对比说明3、源码理解   线程模块,计划用一个系列博文整理总结。上一篇博文:  《线程系列1:创建线程》     1、join() 方法说明   join() 是Thread的实例方...

STRANGE-P 的博客 1万+

实战!在 AMD RX 9070 XT (16G) 上使用原生 Windows ROCm 7.1 部署 ComfyUI + Z-Image-Turbo

本文详细介绍了如何在Windows系统下为AMD Radeon RX 9070 XT显卡配置Z-Image-Turbo AI绘图环境。主要内容包括:安装VS Build Tools和最新显卡驱动,配置Conda Python 3.12环境,安装ROCm 7.1.1 SDK及PyTorch适配版本,部署ComfyUI可视化界面。重点解决了AMD显卡在AI绘图中的适配问题,通过--use-split-cross-attention参数优化显存使用,最终成功搭建了可在消费级16G显存设备上运行的AI绘图环境

qq_33614778的博客 4680

Java 浅析 Thread.join()

调用链:Parent.main() -> child.join() -> child.join(0) -> child.wait(0)(此时 Parent线程会获得 child 实例作为锁,其他线程可以进入 child.join() ,但不可以进入 child.join(0), 因为child.join(0)是同步方法)。的留言,子线程结束后,子线程的this.notifyAll()会被调用,join()返回,父线程只要获取到锁和CPU,就可以继续运行下去了。join(非0)表示等待一段时间。

m0_62396648的博客 973

UVM(5)-TLM通信

TLM是一种基于事务 (transaction) 的通信方式,通常在高抽象级语言例如SystemC或者SV/UVM中作为模块之间的通讯方式。

2301_76431006的博客 2106

BOSS直聘数据采集、解析处理、分析与可视化实战

招聘和求职是一对永恒的话题,不论什么时候都有招聘或者是求职的需求,找不找得到工作可能最主要的就是匹配度是否高,待遇福利是否诱人,如今互联网的快速发展,找工作的方式早已发生了翻天覆地的变化,从以往的面对面形式的招聘简历投递和面试方式,变成了电子简历网络直接投递、远程面试录用的形式,便捷性大大提升,需求的快速增长,促生了一批互联网招聘类的企业,诸如:51job、BOSS直聘、拉勾网等等,为了能...

Together_CZ的博客 9023

【JavaEE】——多线程(join阻塞,计算,引用,状态)

【JavaEE】——多线程,join,sleep引起的线程阻塞,多线程提升计算效率,如何获取线程的引用和状态

阿华的博客 2076

掌握RDMA核心:从同步构建到异步事件的连接艺术

本文深入解析RDMA编程中的双模式设计,揭示同步配置与异步事件机制的协作关系。第一部分阐述同步函数rdma_bind_addr和rdma_listen的本地化角色,强调它们仅完成本地端点配置。第二部分剖析异步事件模型,重点分析连接请求和建立事件的处理流程。通过完整生命周期序列图展示两种模式的交互过程,并提供错误处理、资源管理和性能调优的实用建议。文章指出,理解同步本地配置与异步网络响应这一责任划分,是掌握RDMA编程的关键所在。

数字人生 281

Java并发编程的艺术-thread.join()

内容说明:整理 Java并发编程的艺术中线程间通信,分析Thread.join() 使用案例时,不明白为什么 wait() 的是主线程。准备折腾下 openJDK 源码,无奈 source insight 出bug了,暂时先分析下JDK源码 1. thread.join() 案例 案例说明: ① 使用 new Thread(new Runnable(previous), i) 创建线程名为 i 的线程 ② 每个线程持有previous线程的引用,previous调用 thread.join() 方法 pub

qq_43156556的博客 725

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

深入理解Java并发编程之通过JDK C++源码以及Debug源码死扣Thread.join()

本文转载自个人掘金博客:https://juejin.im/post/5ece5f71f265da76de5cda58 基本含义 如果一个线程A执行了thread.join()语句,其含义是:当前线程A等待thread线程终止之后才从thread.join()返回。 线程Thread除了提供join()方法之外,还提供了join(long millis)和join(long millis,int nanos)两个具备超时特性的方法。这两个超时方法表示,如果线程thread在给定的超时时间里没有终止,那

u011452172的博客 435

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java并发编程之thread.join()方法详解

thread.join()方法的作用:保证线程的执行结果的可见性。原理是通过阻塞主线程实现的。 代码Demo如下: public class ThreadJoinDemo { public static volatile boolean flag = false; public static void main(String[] args) throws Interrupted...

qq_40837310的博客 643

java并发编程基础之Thread.join()的使用

join翻译为加入的意思,顾名思义,就是在其他线程正在执行的时候加入到其中,并且优先于其他线程,直到自己这个线程执行完毕。 下面是一个简单的例子 package juc.thread; import java.util.concurrent.TimeUnit; /** * @Description * @Author DJZ-WWS * @Date 2019/5/15 15:14 ...

tom有cat 250

java并发编程笔记:Thread.join()的使用

如果线程A执行了Thread.join()方法,那么线程A等待Thread线程终止之后才从Thread.join()返回。Thread.join(millis)具备超时特性的方法,如果线程Thread在给定的超时时间里没有终止,那么将会从超时方法中返回。登录后复制 public class join方法的使用 { ...

weixin_41508737的博客 118

java 并发(1) 理解Thread.join()

thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。t.join();      //当前线程中加入线程t,当t执行完成后,当前线程才继续进行。t.join(1000);  //等待 t 线程,等待时间是1000毫秒,无论t是否执行完,主线程1000s后都将会执行...

专注互联网技术 191

Java并发编程的艺术笔记(三)——Thread.join()

t.join()方法只会使主线程进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。它能够使得t.join()中的t优先执行,当t执行完后才会执行其他线程。能够使得线程之间的并行执行变成串行执行。 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也...

weixin_30752377的博客 101

Java多线程5:线程间通信-Thread.join()的使用——学习方腾飞Java并发编程的艺术

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

jay_boolean的博客 334

Java多线程/并发07、Thread.Join()让调用线程等待子线程

开始之前,有几点要理解的: 1、当程序运行的时侯,系统默认开启了一个主线程(假设命名mainThread)。通常我们在Main()函数中定义主线程的工作。 2、可以在Main()函数中启动多个子线程:Thread-1,Thread-2,Thread-3等。 3、主线程有可能比子线程先结束运行。第三点是关键,这也是要用到join()方法的一个重要原因,因为有时侯我们希望主线程等待子线程执行完成之

程序老兵的博客 2038

【多线程】Thread 类及常见方法

1.Thread 类 在Java标准库中,提供有一个Thread,来表示/操作线程。 Thread 类也可以视为Java 标准库提供的API。 创建好的 Thread 实例,其实和操作系统中的线程是一一对应的关系。 操作系统,提供了一组关于线程API(C语言风格),Java对于这组API进一步封装了,就成了Thread类 2.创建线程 2.1继承Thread 类 通过Thread 类创建线程,最基本的做法就是创建子类,继承自Thread ,并且重写run方法 (1)继承Thread 来创建一

m0_60494863的博客 6289

Java多线程:常见的线程的创建方法及Thread类详解

线程是程序的执行流程的最小单元,一个进程(程序的执行实例)可以由一个或多个线程组成,每个线程都有自己的执行路径和执行状态。线程可以并发执行,即多个线程可以同时在不同的处理器核心或计算机上运行,从而提高程序的运行效率。线程与进程的区别在于,进程是操作系统对一个正在运行的程序的抽象,而线程是进程内部的一个执行单位。一个进程可以有多个线程,这些线程共享进程的资源,如内存空间、文件描述符等。线程之间可以通过共享内存的方式进行通信,相比于进程间通信(如管道、消息队列)的开销更小。

luming的博客 1651

java中线程__Thread.join()用途通俗语言理解

理解代码1来源:https://www.jianshu.com/p/fc51be7e5bc0 理解代码2来源:https://www.jianshu.com/p/595be9eab056 一, 先解释Thread.join()的作用 比如有两个线程在一个程序中,分别为线程1,线程2! 其中,线程1,开始新先运行起来(run),线程运行的时候一个概念(有时间片,时间...

weixin_43292394的博客 2948

Java | Thread.join()的作用

join() 的示例和作用 1 // 父线程 2 public class Parent { 3 public static void main(String[] args) { 4 // 创建child对象,此时child表示的线程处于NEW状态 5 Child child = new Child(); 6 // child表示的线程转换为RUNNABLE状态 7 child.start(); 8

黄佳俊的博客 350
上一篇: Java并发之Synchronized
下一篇: 那些年我租过的房
aubergines
博客等级 码龄15年 13粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值