Day8-Java线程中join方法的使用

简介: 笔记

Java多线程中join的方法使用:

package com.tset.two;
/**
 * @author :caizhengjie
 * @description:TODO
 * @date :2021/7/22 10:18 下午
 */
public class TestThreadJoin {
    public static void main(String[] args) throws InterruptedException {
        Object lock = new Object();
        // 线程的join方法
        Runnable task = new Runnable() {
            @Override
            public void run() {
                System.out.println("run() " + Thread.currentThread().getName() + " start");
                try {
                    // 让线程睡5秒
                    Thread.sleep(5 * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("run() " + Thread.currentThread().getName() + " over");
            }
        };
        Thread t1 = new Thread(task,"t1");
        t1.start();
        // 主线程结束
        System.out.println(Thread.currentThread().getName() + " over");
    }
}

先看不加join方法:

main over
run() t1 start
run() t1 over -- t1线程睡5秒钟结束

假设我有这样的一个需求,我需要t1线程执行结束后才打印输出主线程结束,我们可以使用join方法

Thread t1 = new Thread(task,"t1");
t1.start();
// join作用:假设我有这样的一个需求,我需要t1线程执行结束后才打印输出主线程结束
t1.join();

这样输出的结果:

run() t1 start
run() t1 over -- t1线程睡5秒钟结束
main over -- main线程结束

但是如果我有这样的一个需求,t1线程在执行run方法的时候需要耗费5秒钟,但是我们主线程只能等三秒钟的时间,这时我们可以让线程设置超时时间,t1执行到三秒钟的时候,主线程结束

Thread t1 = new Thread(task,"t1");
t1.start();
// join作用:假设我有这样的一个需求,我需要t1线程执行结束后才打印输出主线程结束
// 设置线程超时时间
t1.join(3000);

运行结果:

run() t1 start
main over -- 主线程等不及三秒,先执行
run() t1 over -- 5秒过后t1线程才会结束

类似这种设置超时时间的方法也有其他方法,比如:wait和sleep方法

t1.join(3000);
lock.wait(3000);
Thread.sleep(3000);

有了这些超时时间避免一些死锁,比方说t1线程长时间执行不完我们就不等了继续往下走


相关文章
|
20天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
55 3
|
11天前
|
Java
判断不为空和不为空串的方法java
判断不为空和不为空串的方法java
|
14天前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
1天前
|
XML JavaScript Java
详解Java解析XML的四种方法
详解Java解析XML的四种方法
|
2天前
|
存储 Java API
掌握8条方法设计规则,设计优雅健壮的Java方法
掌握8条方法设计规则,设计优雅健壮的Java方法
|
2天前
|
Java C语言
详解java方法与递归
详解java方法与递归
9 3
|
2天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
9 0
|
3天前
|
Java
Java一分钟之-方法定义与调用基础
【5月更文挑战第8天】本文介绍了Java编程中的方法定义和调用,包括基本结构、常见问题和避免策略。方法定义涉及返回类型、参数列表和方法体,易错点有返回类型不匹配、参数错误和忘记返回值。在方法调用时,要注意参数传递、静态与非静态方法的区分,以及重载方法的调用。避免错误的策略包括明确返回类型、参数校验、理解值传递、区分静态和非静态方法以及合理利用重载。通过学习和实践,可以提升编写清晰、可维护代码的能力。
13 0
|
5天前
|
搜索推荐 Java Shell
8大Java排序方法(由简入繁),有代码详解和原理指导
8大Java排序方法(由简入繁),有代码详解和原理指导
27 0
|
11天前
|
Java API
【亮剑】三种有效的方法来删除List中的重复元素Java的List
【4月更文挑战第30天】本文介绍了三种Java中删除List重复元素的方法:1) 使用HashSet,借助其不允许重复值的特性;2) 利用Java 8 Stream API的distinct()方法;3) 对自定义对象重写equals()和hashCode()。每种方法都附带了代码示例,帮助理解和应用。