首页 > 其他分享 >Thread常见方法:join 方法详解

Thread常见方法:join 方法详解

时间:2023-12-07 23:01:24浏览次数:37  
标签:join r1 Thread start t1 r2 详解 static

为什么需要 join

下面的代码执行,打印 r 是什么?

static int r = 0;
public static void main(String[] args) throws InterruptedException {
 test1();
}
private static void test1() throws InterruptedException {
 log.debug("开始");
 Thread t1 = new Thread(() -> {
 log.debug("开始");
 sleep(1);
 log.debug("结束");
 r = 10;
 });
 t1.start();
 log.debug("结果为:{}", r);
 log.debug("结束");
}

分析

  • 因为主线程和线程 t1 是并行执行的,t1 线程需要 1 秒之后才能算出 r=10
  • 而主线程一开始就要打印 r 的结果,所以只能打印出 r=0

解决方法

  • 用 sleep 行不行?为什么?
  • 用 join,加在 t1.start() 之后即可

应用之同步

以调用方角度来讲,如果

  • 需要等待结果返回,才能继续运行就是同步
  • 不需要等待结果返回,就能继续运行就是异步

Thread常见方法:join 方法详解_线程中断

等待多个结果

问,下面代码 cost 大约多少秒?

static int r1 = 0;
static int r2 = 0;
public static void main(String[] args) throws InterruptedException {
 test2();
}
private static void test2() throws InterruptedException {
 Thread t1 = new Thread(() -> {
 sleep(1);
 r1 = 10;
 });
 Thread t2 = new Thread(() -> {
 sleep(2);
 r2 = 20;
 });
 long start = System.currentTimeMillis();
 t1.start();
 t2.start();
 t1.join();
 t2.join();
 long end = System.currentTimeMillis();
 log.debug("r1: {} r2: {} cost: {}", r1, r2, end - start);
}

分析如下

  • 第一个 join:等待 t1 时, t2 并没有停止, 而在运行
  • 第二个 join:1s 后, 执行到此, t2 也运行了 1s, 因此也只需再等待 1s

如果颠倒两个 join 呢?

最终都是输出

20:45:43.239 [main] c.TestJoin - r1: 10 r2: 20 cost: 2005

Thread常见方法:join 方法详解_join_02

有时效的 join。

Thread常见方法:join 方法详解_线程常用方法_03

等够时间

线程已经执行完成,r1的值已经被修改

static int r1 = 0;
static int r2 = 0;
public static void main(String[] args) throws InterruptedException {
 test3();
}
public static void test3() throws InterruptedException {
 Thread t1 = new Thread(() -> {
 sleep(1);
 r1 = 10;
 });
 long start = System.currentTimeMillis();
 t1.start();
 // 线程执行结束会导致 join 结束
 t1.join(1500);
 long end = System.currentTimeMillis();
 log.debug("r1: {} r2: {} cost: {}", r1, r2, end - start);
}

输出

20:48:01.320 [main] c.TestJoin - r1: 10 r2: 0 cost: 1010
没等够时间

t1线程睡眠2秒,join花费1.5秒,此时r1的值还没修改,直接终止执行

static int r1 = 0;
static int r2 = 0;
public static void main(String[] args) throws InterruptedException {
 test3();
}
public static void test3() throws InterruptedException {
 Thread t1 = new Thread(() -> {
 sleep(2);
 r1 = 10;
 });
 long start = System.currentTimeMillis();
 t1.start();
 // 线程执行结束会导致 join 结束
 t1.join(1500);
 long end = System.currentTimeMillis();
 log.debug("r1: {} r2: {} cost: {}", r1, r2, end - start);
}

输出

20:52:15.623 [main] c.TestJoin - r1: 0 r2: 0 cost: 1502

标签:join,r1,Thread,start,t1,r2,详解,static
From: https://blog.51cto.com/AmbitionGarden/8728351

相关文章

  • HTTPS 请求中的证书验证详解(Python版)
    在网络通信中,HTTPS是一种通过SSL/TLS加密的安全HTTP通信协议。证书在HTTPS中扮演着至关重要的角色,用于验证服务器身份并加密数据传输。本文将深入探讨Python中HTTPS请求中的证书相关内容,并提供详细的代码示例。1.证书的基本概念SSL/TLS证书是一种由证书颁发机构签发的......
  • Java File类详解(下)练习部分
    练习第一题需求:在当前模块下的aaa文件夹中创建一个a.txt文件importjava.io.File;importjava.io.IOException;publicclassFileExer01{publicstaticvoidmain(String[]args)throwsIOException{Filef1=newFile("AllInOne\\aaa");f1.mkdirs();Filesrc=ne......
  • UML学习详解
    一、用例图:描述角色以及角色与用例之间的连接关系。说明的是谁要使用系统,以及他们使用该系统可以做些什么。1.用例图的含义由参与者(Actor)、用例(UseCase)以及它们之间的关系构成的用于描述系统功能的动态视图称为用例图。要在用例图上显示某个用例,可绘制一个椭圆,然后将用例的......
  • EF CodeFirst 数据注解特性详解
    数据注解特性是.NET特性,可以在EF或者EFCore中,应用于实体类上或者属性上进行生成数据表,并对表名、字段类型、长度、主键、是否为空、外键等进行设置。1、命名空间在EF6和EFCore中,数据注解特性包含在System.ComponentModel.DataAnnotations命名空间和System.ComponentModel.Dat......
  • 学习笔记----------------------SendMessage 详解【转】
    SendMessage函数的常用消息及其应用函数原型:DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsLong,_ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong 其中四个参数的含义和说明如下:1.hWnd:对象的句柄。希......
  • UML中九种图以及图中元素所代表的含义详解
    UML是一种建模语言,它用于描述系统的结构和行为。在UML1.4中提供了九种常用的图,如用例图、类图、对象图、状态图、活动图、时序图、协作图、组件图以及配置图。一、用例图:描述角色以及角色与用例之间的连接关系。说明的是谁要使用系统,以及他们使用该系统可以做些什么。1.用例图......
  • 一文详解安全随机数
    本文分享自华为云社区《【安全攻防】深入浅出实战系列专题-安全随机数》,作者:MDKing。随机数的使用场景使用随机数可分类安全场景跟非安全场景。非安全场景需要生成的越快越好。安全场景使用的随机数必须足够安全,保证不能被预测到。常见的非安全场景:数据的索引号、标识;......
  • HydroOJ 从入门到入土(4)控制面板-系统设置详解
    控制面板内众多配置项眼花缭乱,至于说明文档...这个真没有!这里的配置有很多,如果装了插件,有一些插件的配置项也是在这里修改,所以很有必要了解一下这些选项都是干什么的.目录SMTP设置服务器设置setting_limits各种保护性限制基础设置Session设置hydroojui-default显......
  • Java开发者必备:Maven简介及使用方法详解!
    今天我们来介绍一个在Java开发中非常重要的工具——Maven。如果你是一名Java开发者,那么你一定不会对Maven感到陌生。但是,对于一些新手来说,可能还不太了解Maven是什么,它有什么作用,以及如何使用它。接下来,就让我们一起来深入了解一下Maven吧!一、maven简介Maven是什么Maven是一个......
  • 一文详解安全随机数
    本文分享自华为云社区《【安全攻防】深入浅出实战系列专题-安全随机数》,作者:MDKing。随机数的使用场景使用随机数可分类安全场景跟非安全场景。非安全场景需要生成的越快越好。安全场景使用的随机数必须足够安全,保证不能被预测到。常见的非安全场景:数据的索引号、标识;文件的名称或......