Java中Thread.join()的使用方法

yizhihongxing

下面我来详细讲解Java中Thread.join()的使用方法。

Thread.join()方法

Thread.join()方法是一个用于等待线程结束的方法。在执行线程时,可以调用join()方法,让当前线程等待被调用join()方法的线程执行完成后才继续往下执行。

语法

public final void join() throws InterruptedException
public final synchronized void join(long millis) throws InterruptedException

join()方法有两种重载形式,其中第一种线程一直等待,直到被等待线程执行完成;而第二种则是在线程等待一定时间后,若等待完指定的时间而被等待线程依然没有执行完,则当前线程不再等待。

示例一

下面是一个使用Thread.join()方法的简单示例:

public class JoinDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            System.out.println("线程1开始执行");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程1执行完成");
        });

        Thread t2 = new Thread(() -> {
            System.out.println("线程2开始执行");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程2执行完成");
        });

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

        // 等待t1和t2执行完成后再往下执行
        t1.join();
        t2.join();

        System.out.println("主线程执行完成");
    }
}

上面的代码中,首先创建了两个线程t1和t2,并在主线程中启动它们。接着在主线程中分别调用了t1.join()和t2.join()方法,这意味着主线程会等待t1和t2执行完成后再执行。

运行上面的代码,可以看到输出结果如下:

线程1开始执行
线程2开始执行
线程1执行完成
线程2执行完成
主线程执行完成

可以看到,当t1和t2执行完成后,主线程才会继续执行下去。

示例二

再来看一个稍微复杂一点的示例:

public class JoinDemo2 {
    public static volatile int count = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            synchronized (JoinDemo2.class) {
                for (int i = 0; i < 1000000; i++) {
                    count++;
                }
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (JoinDemo2.class) {
                for (int i = 0; i < 1000000; i++) {
                    count++;
                }
            }
        });

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

        t1.join();
        t2.join();

        System.out.println("count = " + count);
    }
}

上面的代码中,创建了两个线程t1和t2,它们都会执行一个类变量count的自增操作。由于count是static的,因此要使用JoinDemo2.class作为synchronized锁对象,避免多线程访问异常。

在主线程中启动t1和t2,然后分别调用它们的join()方法,用于等待它们执行完成后再打印count的值。

运行上面的代码,可以看到输出结果如下:

count = 2000000

可以看到,由于使用了Thread.join()方法,确保了t1和t2线程执行完成后,主线程才打印了count的最终值 2000000。

总结

通过上面的两个示例,大家应该已经掌握了Thread.join()方法的使用方法,以及它的作用。当需要等待某个线程执行完成后再继续执行的时候,可以使用join()方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中Thread.join()的使用方法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java编码辅助工具Lombok用法详解

    Java编码辅助工具Lombok用法详解 Lombok是一个Java编码辅助工具,可以简化Java代码的编写。下面将详细讲解Lombok的用法。 安装 Lombok可以在Maven中央仓库中获取。在Maven项目中引入Lombok的依赖即可: <dependency> <groupId>org.projectlombok</gr…

    Java 2023年5月20日
    00
  • jQuery+jsp实现省市县三级联动效果(附源码)

    实现省市县三级联动效果是Web开发中经常需要的功能之一。在这个过程中,jQuery 和 jsp 无疑是非常好的组合,因为 jQuery 可以方便的获取和操作DOM元素,jsp则具有动态生成html页面的优势。本文将分享一篇详细的攻略,教你如何使用 jQuery 和 jsp 实现省市县三级联动效果,并附上完整的源码。 一、前置知识 在阅读本篇攻略前,你需要具备…

    Java 2023年6月15日
    00
  • 简单谈谈Java中的栈和堆

    让我来详细讲解一下Java中的栈和堆。 栈和堆的概念 Java中的栈和堆是内存分配的两种方式,它们持有程序的数据。 栈是一种数据结构,是一块连续的内存空间,存储程序的方法调用以及局部变量等临时数据。栈内存在程序执行完毕后自动释放,因此不需要手动管理内存,更不需要垃圾回收。栈是由操作系统自动进行分配和释放的,是一种高效的数据结构。 堆是另一种数据结构,是Jav…

    Java 2023年5月26日
    00
  • 详解SpringMVC的两种实现方式

    详解SpringMVC的两种实现方式 Spring MVC是一个基于MVC架构的Web框架,它可以用于构建Web应用程序。Spring MVC框架提供了一组组件,包括控制器、视解析器、处理器映射器、数据绑定、数据验证、异常处理等,可以帮助我们快速开发Web应用程序。在Spring MVC中,我们可以使用两种方式来实现控制器:注解方式和XML配置方式。 注解方…

    Java 2023年5月18日
    00
  • 详解Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    针对这个话题,我将分几个部分进行详细讲解。 1. 了解Java 网络IO编程 1.1 BIO BIO即Blocking IO,同步阻塞IO,应用方面比较广泛,缺点是每个客户端连接时都需要创建一个线程,因此比较消耗系统资源,如果客户端连接数比较少,建议使用BIO。 1.2 NIO NIO即Non-blocking IO,同步非阻塞IO,优点是可以支持多路复用,…

    Java 2023年5月23日
    00
  • Spring实战之Bean的作用域request用法分析

    Spring实战之Bean的作用域request用法分析 什么是Bean作用域 在Spring中,Bean作用域指的是一个Bean实例的创建和存在方式。Spring框架中有多种Bean作用域,包括“singleton”、“prototype”、“request”等。 singleton:Bean在整个应用程序中只有一个实例,即在容器启动时,Spring IO…

    Java 2023年5月19日
    00
  • Spring Boot配置接口WebMvcConfigurer的实现

    下面是关于“Spring Boot配置接口WebMvcConfigurer的实现”的完整攻略,包含两个示例说明。 Spring Boot配置接口WebMvcConfigurer的实现 Spring Boot提供了许多配置选项来自定义应用程序的行为。其中,WebMvcConfigurer接口提供了许多配置选项来自定义Spring MVC的行为。本文将介绍如何实…

    Java 2023年5月17日
    00
  • 如何在Java中创建线程通信的四种方式你知道吗

    当多个线程共同操作同一个对象时,可能会遇到竞争态况或阻塞,需要使用线程通信来实现协调和同步,以确保程序的正确性和效率。在Java中,创建线程通信的方式有以下四种: 一、wait()和notify() wait()和notify()是Java中最基本的线程通信方式。wait()的作用是使当前线程挂起,直到另一个线程调用相同对象的notify()方法唤醒它。no…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部