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