Thread.join()方法解析

飞牛Docker部署Zerotier后无法访问?三步搞定SSH权限配置! 本文详细解析了在飞牛NAS上通过Docker部署Zerotier后无法访问的常见问题及解决方案。重点介绍了SSH权限配置、tun模块加载和Docker容器权限设置等关键步骤,帮助用户快速解决虚拟网络接口的权限问题,确保Zerotier节点间的正常通信。 阅读详情

API:

join

public final void join()
                throws InterruptedException
等待该线程终止。


抛出:
InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的 中断状态 被清除。

join

public final void join(long millis)
                throws InterruptedException
等待该线程终止的时间最长为 millis 毫秒。超时为 0 意味着要一直等下去。


参数:
millis - 以毫秒为单位的等待时间。
抛出:
InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的 中断状态 被清除。

join

public final void join(long millis,
                       int nanos)
                throws InterruptedException
等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。


参数:
millis - 以毫秒为单位的等待时间。
nanos - 要等待的 0-999999 附加纳秒。
抛出:
IllegalArgumentException - 如果 millis 值为负,则 nanos 的值不在 0-999999 范围内。
InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的 中断状态 被清除。

解析:

Thread.join(),是用来指定当前主线程等待其他线程执行完毕后,再来继续执行Thread.join()后面的代码。


例1:

package com.example;

import java.util.Date;
import java.util.concurrent.TimeUnit;

public class DataSourcesLoader implements Runnable{

	@Override
	public void run() {
		System.out.printf("Beginning data sources loading: %s\n",new Date());
	    try {
	      TimeUnit.SECONDS.sleep(4);
	    } catch (InterruptedException e) {
	      e.printStackTrace();
	    }
	    System.out.printf("Data sources loading has finished: %s\n",new Date());
	}

	public static void main(String[] args){
		DataSourcesLoader dsLoader = new DataSourcesLoader();
	    Thread thread1 = new Thread(dsLoader,"DataSourceThread");
	    
	    thread1.start();
	    
	    try {
	        thread1.join();
	      } catch (InterruptedException e) {
	        e.printStackTrace();
	      }
	      
	      System.out.printf("Main: Configuration has been loaded: %s\n",new Date());
	}

}
执行结果:

Beginning data sources loading: Fri Nov 14 14:27:31 CST 2014
Data sources loading has finished: Fri Nov 14 14:27:35 CST 2014
Main: Configuration has been loaded: Fri Nov 14 14:27:35 CST 2014
如果去掉thread1.join(),执行的结果如下:

Main: Configuration has been loaded: Fri Nov 14 14:28:33 CST 2014
Beginning data sources loading: Fri Nov 14 14:28:33 CST 2014
Data sources loading has finished: Fri Nov 14 14:28:37 CST 2014
通过结果,就可以很明显的说明上面红字的部分:“ 再来继续执行Thread.join()后面的代码”

例2:

package com.example;

import java.util.Date;
import java.util.concurrent.TimeUnit;

public class DataSourcesLoader implements Runnable{

	@Override
	public void run() {
		System.out.printf("Beginning data sources loading: %s\n",new Date());
	    try {
	      TimeUnit.SECONDS.sleep(4);
	    } catch (InterruptedException e) {
	      e.printStackTrace();
	    }
	    System.out.printf("Data sources loading has finished: %s\n",new Date());
	}

	public static void main(String[] args){
		DataSourcesLoader dsLoader = new DataSourcesLoader();
	    Thread thread1 = new Thread(dsLoader,"DataSourceThread");
	    
	    thread1.start();
	    
	    try {
	        thread1.join(3000);
	      } catch (InterruptedException e) {
	        e.printStackTrace();
	      }
	      
	      System.out.printf("Main: Configuration has been loaded: %s\n",new Date());
	}

}

这里使用的是:
thread1.join(3000);
这句话的意思是,只要满足下面2个条件中的一个时,主线程就会继续执行thread.join()后面的代码:

条件1:thread1 执行完毕;

条件2:已经等待 thread1 执行了3000ms.

例子中,thread1 自身的执行时间是4s,而设置的等待时间是3s,所以得到的执行结果如下,thread1还没有执行完,主线程就开始执行后面的代码,因为 thread1 等待的时间已经超时了:

Beginning data sources loading: Fri Nov 14 14:35:45 CST 2014
Main: Configuration has been loaded: Fri Nov 14 14:35:48 CST 2014
Data sources loading has finished: Fri Nov 14 14:35:49 CST 2014



那么结合上面的2个例子,我们可以推断出下面代码的执行结果了:

例3:

package com.example;

import java.util.Date;
import java.util.concurrent.TimeUnit;

public class DataSourcesLoader implements Runnable{

	@Override
	public void run() {
		System.out.printf("Beginning data sources loading: %s\n",new Date());
	    try {
	      TimeUnit.SECONDS.sleep(4);
	    } catch (InterruptedException e) {
	      e.printStackTrace();
	    }
	    System.out.printf("Data sources loading has finished: %s\n",new Date());
	}

}

package com.example;

import java.util.Date;
import java.util.concurrent.TimeUnit;

public class NetworkConnectionsLoader implements Runnable{

	@Override
	public void run() {
		System.out.printf("Beginning network connect loading: %s\n",new Date());
	    try {
	      TimeUnit.SECONDS.sleep(6);
	    } catch (InterruptedException e) {
	      e.printStackTrace();
	    }
	    System.out.printf("Network connect loading has finished: %s\n",new Date());
		
	}
	
	public static void main(String[] args){
		DataSourcesLoader dsLoader = new DataSourcesLoader();
	    Thread thread1 = new Thread(dsLoader,"DataSourceThread");
	    
	    NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader();
	    Thread thread2 = new Thread(ncLoader,"NetworkConnectionLoader");
	    
	    thread1.start();
	    thread2.start(); 
	    
	    try {
	        thread1.join();
	        thread2.join(1900);
	      } catch (InterruptedException e) {
	        e.printStackTrace();
	      }
	      
	      System.out.printf("Main: Configuration has been loaded: %s\n",new Date());
	}

}
执行结果:

Beginning data sources loading: Fri Nov 14 14:39:20 CST 2014
Beginning network connect loading: Fri Nov 14 14:39:20 CST 2014
Data sources loading has finished: Fri Nov 14 14:39:24 CST 2014
Main: Configuration has been loaded: Fri Nov 14 14:39:26 CST 2014
Network connect loading has finished: Fri Nov 14 14:39:26 CST 2014

注意:如果把例3的 thread2.join(1900) 部分修改为:

thread2.join(3000);
结果会和上面的一样吗?

根据我最开始指出的“ Thread.join(),是用来指定当前主线程等待其他线程执行完毕后,再来继续执行Thread.join()后面的代码。”

我们可以看到,执行结果会有差别:

Beginning data sources loading: Fri Nov 14 14:41:21 CST 2014
Beginning network connect loading: Fri Nov 14 14:41:21 CST 2014
Data sources loading has finished: Fri Nov 14 14:41:25 CST 2014
Network connect loading has finished: Fri Nov 14 14:41:27 CST 2014
Main: Configuration has been loaded: Fri Nov 14 14:41:27 CST 2014</span>

至于为什么会有这个差别,我上面也已经说明了,我想这个应该不难理解。

PS:代码部分截取来自《Java 7 Concurrency Cookbook》

AIOps探索 | 如何用大模型构建高效运维知识及智能问答平台(1) 好久没有分享AIOps相关干货了,最近大模型这么火,而且我们有客户已经基于大模型构建了知识及智能问答平台,需要在运维领域结合使用场景进行应用。为此,楼主从头到尾声梳理了一遍大模型在运维领域构建知识及智能问答平台的应用场景、技术实现,总结出来供大家一同探索,希望对大家理解和运用大模型有一定帮助~ 阅读详情

相关推荐

doris2.1.8连接报错ERROR 1203 (42000): Reach limit of connections解决办法

摘要:客户Doris数据库报错"ERROR 1203 (42000): Reach limit of connections"的解决过程。发现AI提供的解决方案存在错误:1)查询命令应为SHOW FRONTEND CONFIG而非show variables;2)参数名称应为qe_max_connection而非max_connections。正确解决步骤:1)用admin账户登录查看连接数限制和当前连接数;2)通过SHOW PROPERTY命令检查用户资源限制;3)针对不同情况修改参数

Brent的专栏 1762

Thread 的 join() 方法

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

STRANGE-P 的博客 1万+

避开这些坑!SOEM控制伺服电机时PDO配置与状态机处理的常见误区

本文深入探讨了使用SOEM控制伺服电机时PDO配置与状态机处理的常见误区,提供了详细的避坑指南。从SyncManager配置顺序到状态字位掩码应用,再到网络同步优化,帮助开发者避免通信失败和系统不稳定问题,提升工业自动化项目的可靠性。

chongtai6075的博客 482

多线程中Thread的join方法

多线程中Thread的join方法 join简介 join方法是Thread类中的一个方法,该方法的定义是等待该线程执行直到终止。其实就说join方法将挂起调用线程的执行,直到被调用的对象完成它的执行。 join实例(以一道面试题为例) 现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完之后执行,T3在T2执行完后执行?这个问题是网上很热门的面试题(这里除了join还有很多方法能够实现,只是使用join是最简单的方案),下面是实现的代码: /** * @author wcc * @date 20

weixin_46410481的博客 3万+

当NetApp 7-mode遇到单控制器故障:HA模式手动修复全记录

本文详细记录了NetApp 7-mode存储系统在单控制器故障时的应急修复过程,包括HA配置重建、磁盘初始化和业务恢复等关键步骤。通过实战案例解析如何解决`VIA Interconnect is down`等典型问题,为企业级存储系统的高可用保障提供实用指南。

yolo5detector的博客 246

OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南

OpenClaw已经开源3个月有余,作为深耕AI Agent领域的博主,我亲身探索了各种基于OpenClaw的赚钱方法,也踩过坑、付出了时间与精力。现在,我将这些真金白银砸出来的实战经验,毫无保留地总结成这个专栏,分享给不想从零开始摸索的你。博主在优快云已有7万+粉丝和1100万+阅读量,但这却是我的第一个付费专栏。正因如此,我比任何人都更珍惜这个“第一次”。我会像一个手艺人打磨作品一样,死磕每一篇文章的质量,并持续根据订阅者的反馈优化内容。也许你的疑问就是当篇文章的优化点。

冯·诺依曼 2439

java中Thread.join()方法

1. Thread.join()方法是什么 Thread.join()方法是Thread类中的一个方法,该方法的定义是等待该线程终止。其实就是join()方法将挂起调用线程的执行, 直到被调用的线程完成它的执行。 举例说明:在主线程中调用t1.join()方法,主线程将等待t1线程终止。join()方法挂起主线程的执行,直到t1执行完毕后主线程才接着执行。 2. Thread.join如何使用 现...

大道至简,知易行难 1323

AI Agent智能体在Android开发中的应用

本文探讨了AIAgent(智能代理体)在Android开发中的应用,涵盖技术原理、实践案例与未来趋势。AIAgent通过机器学习、自然语言处理等技术实现代码生成、测试自动化及性能优化,显著提升开发效率。例如,强化学习模型可优化APP响应时间(公式:$\text{响应时间}=f(\text{负载},\text{资源})$),自动化测试覆盖率提升至95%。

郑伟强dev的专栏 124

Thread的join方法

本文简明扼要地介绍了Java多线程编程中的join()方法。join()让调用线程等待目标线程执行完毕,常用于确保线程间有序执行。通过代码示例展示了未使用join()导致的数据错误,以及使用join()正确获取计算结果的过程。文章还介绍了带超时的join(long millis)方法,避免无限等待。关键点是:join()会阻塞当前线程,直到目标线程结束;适用于线程间存在依赖关系的场景;是Thread类的基本方法之一。

weixin_46028606的博客 1558

AMBA-AXI and ACE协议详解(十)

本章介绍了ACE协议中的Barrier事务机制,包括内存屏障和同步屏障两种类型。

Crazzy_M的博客 612

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java Thread.join () 方法详细解析

本文详细解析了Java中的Thread.join()方法。该方法用于实现线程同步,使调用线程等待目标线程终止或超时。文章介绍了三种重载方法:无参join()实现无限等待,带毫秒参数join(long millis)实现超时等待,以及高精度版本join(long millis, int nanos)。通过示例代码演示了基本用法、超时处理和多线程等待场景。重点分析了join()与sleep()的区别,指出join()会释放对象锁而sleep()不会。文章还提供了源码解析,说明其基于Object.wait()的实

码灵的博客 2689

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Thread join() 方法解析

java.lang.Thread的join()方法部分源码如下: public final synchronized void join(long millis) throws InterruptedException{ long base = System.currentTimeMillis(); long now = 0; if(millis < 0){ throw ...

weixin_30418341的博客 83

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

直接上源码: join()方法的调用的例子,可以看我的上一篇博客:https://blog.csdn.net/river66/article/details/91492758 wait()方法的使用,可以看我的另一篇博客:https://blog.csdn.net/river66/article/details/90718182 private final Object lock = n...

river66的博客 878

Thread的join()方法解析

一般用join方法实现主线程等待其他异步线程完成,今天就看看它到底是咋实现的。 先看下示例 // 子线程 static class SleepThread implements Runnable { @Override public void run() { try { System.out.println("子线程开始"); Thread.sleep(1000);

wthfeng的专栏 517

你真得懂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

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

Java多线程中的join()方法

1.Thread中的join() join()把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。 t.join(); //使调用线程 t 在此之前执行完毕。 t.join(1000); //等待 t 线程,等待时间是1000毫秒 2.为什么要用join()方法 主线程生成并...

龙吟山庄 526

【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万+

Thread类中的join()方法

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

中国华的博客 1746

Java Thread.join()详解

一、使用方式。 join是Thread类的一个方法,启动线程后直接调用,例如: ? 1 Thread t = new AThread(); t.start(); t.join(); 二、为什么要用join()方法 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理...

560

Thread.join()方法详解

API:   join public final void join() throws InterruptedException 等待该线程终止。   抛出: InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。     join public final v...

1771
上一篇: web.xml中的url-pattern映射规则和URL解析
下一篇: ThreadLocal小记
JustForFly
博客等级 码龄20年 18粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值