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线程长时间执行不完我们就不等了继续往下走


相关文章
|
6天前
|
Java
Java如何标记异步方法
【8月更文挑战第13天】Java如何标记异步方法
14 1
|
12天前
|
安全 机器人 Java
|
5天前
|
Java
【Java】Math、System、RunTime、BigDecimal类常用方法
【Java】Math、System、RunTime、BigDecimal类常用方法
|
1天前
|
存储 Java
|
5天前
|
存储 安全 Java
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
这篇文章是关于Java面试的第二天笔记,涵盖了HashMap与HashTable的区别、ConcurrentHashMap的实现原理、IOC容器的实现方法、字节码的概念和作用、Java类加载器的类型、双亲委派模型、Java异常体系、GC如何判断对象可回收、线程的生命周期及状态,以及sleep、wait、join、yield的区别等十道面试题。
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
|
11天前
|
存储 Java 编译器
Java 基础语法-方法
Java 基础语法-方法
26 12
|
7天前
|
Java
Java aop 如何获取方法的参数体
【8月更文挑战第12天】Java aop 如何获取方法的参数体
30 2
|
11天前
|
存储 算法 Oracle
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
39 8
|
12天前
|
Java API 开发者
Java中的Lambda表达式:简化代码的现代方法
Lambda表达式,这一Java 8引入的特性,为开发者提供了一种更加紧凑、易读的编码风格。本文将深入探讨Lambda表达式的概念、使用场景以及它如何改变我们处理集合、线程和函数式接口的方式,旨在帮助读者理解并有效利用Lambda表达式来优化他们的Java代码。
|
10天前
|
机器学习/深度学习 算法 Java
Java调用Python方法
【8月更文挑战第7天】