首页 > 其他分享 >Thread 之 join() 方法

Thread 之 join() 方法

时间:2024-01-10 17:14:27浏览次数:21  
标签:join currentThread Thread getName t1 线程 方法 log

案例代码

@Slf4j
public class JoinDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            log.info("{} 线程启动", Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info("{} 线程执行任务", Thread.currentThread().getName());
        }, "t1");

        Thread t2 = new Thread(() -> {
            log.info("{} 线程启动", Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info("{} 线程执行任务", Thread.currentThread().getName());
        }, "t2");

        t1.start();
        t2.start();
        log.info("{} 线程执行任务", Thread.currentThread().getName());
    }
}

从上面的结果可以看出,main 线程首先获取到了 CPU 的时间片,然后执行,接着 t2 和 t1 获取到 CPU 时间片,获得执行

如果我们想 main 线程在 t1 和 t2 线程执行完任务之后再去执行 main 线程的任务,那该怎么办呢,这个时候就可以使用线程类提供的 join 方法了

@Slf4j
public class JoinDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            log.info("{} 线程启动", Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info("{} 线程执行任务", Thread.currentThread().getName());
        }, "t1");

        Thread t2 = new Thread(() -> {
            log.info("{} 线程启动", Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info("{} 线程执行任务", Thread.currentThread().getName());
        }, "t2");

        t1.start();
        t2.start();

        // 在主线程中分别调用 t1、t2 线程的 join() 方法,那么主线程就会等待 t1 和 t2 线程执行完毕之后再去执行主线程自身的任务
        t1.join();
        t2.join();

        log.info("{} 线程执行任务", Thread.currentThread().getName());
    }
}

使用 join 方法之后,main 线程会等待 t1、t2 线程执行完成自身的任务之后,接着才会去执行 main 线程的任务

上面我们使用的是 join() 的无参方法,无参的 join 方法实际上就是等价于 join(0)

接着我们看一下这个有参的 join 方法

如果传递进来的参数大于 0,底层实际上是调用 wait(delay),这个方法的作用是只会做有时限的等待,过时不候

@Slf4j
public class JoinDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            log.info("{} 线程启动", Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info("{} 线程执行任务", Thread.currentThread().getName());
        }, "t1");

        t1.start();

        // 只会做有时限的等待,如果等待的时间超过了 t1 线程的执行时间,那么就不再继续等待了
        t1.join(2000);

        log.info("{} 线程执行任务", Thread.currentThread().getName());
    }
}

从执行结果中可以看出,main 线程只等待了 2000ms,然后就开始执行 main 线程的任务去了,此时 t1 线程还没有执行完毕,main 线程就停止了等待

 

标签:join,currentThread,Thread,getName,t1,线程,方法,log
From: https://www.cnblogs.com/xiaomaomao/p/17956867

相关文章

  • 工程监测领域振弦采集仪的数据处理与分析方法探讨
    工程监测领域振弦采集仪的数据处理与分析方法探讨在工程监测领域,振弦采集仪是常用的一种设备,用于测量和记录结构物的振动数据。数据处理和分析是使用振弦采集仪得到的数据的重要环节,可以帮助工程师了解结构物的振动特性,评估结构的安全性,以及检测结构的健康状况。下面是关于振弦采......
  • 工程监测领域振弦采集仪的数据处理与分析方法探讨
    工程监测领域振弦采集仪的数据处理与分析方法探讨在工程监测领域,振弦采集仪是常用的一种设备,用于测量和记录结构物的振动数据。数据处理和分析是使用振弦采集仪得到的数据的重要环节,可以帮助工程师了解结构物的振动特性,评估结构的安全性,以及检测结构的健康状况。下面是关于振弦采集......
  • BOSHIDA 了解DC电源模块的基本参数及选择方法
    BOSHIDA了解DC电源模块的基本参数及选择方法DC电源模块是一种用来提供稳定直流电源的设备,常被应用在电子产品测试、实验室设备等领域。了解DC电源模块的基本参数和选择方法有助于正确选择和使用合适的模块。 1.输出电压范围:DC电源模块通常有固定的输出电压范围,例如0-30V。......
  • 测试SuspendThread、ResumeThread
    #include<iostream>#include<windows.h>#include<process.h>#include<conio.h>enum{ EVT_PAUSE=0, EVT_RESUME, EVT_QUIT, EVT_TOTAL};staticHANDLEevents[EVT_TOTAL]={NULL,NULL,NULL};staticunsignedint__stdcallhe......
  • PHP发送邮件SMTP有什么好的方法?
    PHP是一种强大的服务器端脚本语言,广泛应用于Web开发领域。在Web应用程序中,邮件通知是一个不可或缺的功能。本文将探讨如何使用PHP发送邮件SMTP,并介绍一些优秀的方法。1.PHP邮件功能简介PHP本身提供了邮件发送的基本功能,但在真实的应用场景中,使用SMTP(SimpleMailTransferProtocol......
  • 在Python中,classmethod是一个修饰符,它用于指定类中的某个方法为类方法1。这种方法不需
    classA(object):bar=1deffunc1(self):print('foo')@classmethoddeffunc2(cls):print('func2')print(cls.bar)cls().func1()A.func2()#不需要实例化Ins=A()Ins.func1()#需要实例化在Pyth......
  • 外贸网站设计的方法有哪些?
    随着全球贸易的不断发展,外贸网站设计成为企业开拓国际市场的关键一环。一流的外贸网站设计能够吸引客户,提升用户体验,从而增加交易机会。本文将探讨一些有效的外贸网站设计方法,帮助企业在竞争激烈的国际市场中脱颖而出。1.响应式设计:在外贸网站设计中,响应式设计是至关重要的一环。......
  • 外贸网站设计的方法有哪些?
    随着全球贸易的不断发展,外贸网站设计成为企业开拓国际市场的关键一环。一流的外贸网站设计能够吸引客户,提升用户体验,从而增加交易机会。本文将探讨一些有效的外贸网站设计方法,帮助企业在竞争激烈的国际市场中脱颖而出。1.响应式设计:在外贸网站设计中,响应式设计是至关重要的一环。......
  • 企业防止数据泄露的措施有什么方法吗?
    随着信息技术的飞速发展,数据已经成为现代社会最为重要的资源之一。然而,随之而来的数据安全问题也日益突出,数据泄露事件频发,给企业和个人带来了巨大的损失。为了保护数据安全,防止数据泄露,人们采取了各种措施,如加密技术、访问控制、匿名化技术等。但是这些技术都需要专业知识来正确......
  • Python教程(22)——Python面向对象的属性和方法
    在Python面向对象编程中,属性和方法是类及其对象的重要组成部分。如果说封装、继承和多态是面向对象编程中的思想,那么类的属性和方法就是骨架,因为有属性和方法,面向对象编程才变的有血有肉。属性属性是类或对象所拥有的数据,它用于描述对象的特征和状态。属性可以是实例属性(对象特......