join()

1)谁等待这个线程结束

2)等多久

    public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }

 示例:

    public static void main(String[] args) {

        Thread t = new Thread(() -> {
            System.out.println(1);
        });

        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

Waits for this thread to die.

this 指的是正在调用 join 方法的引用,即 t

那么便是当前线程(主线程,t的父线程)等待 t 结束

 蓝色线代表主线程,绿色线代表子线程,x 轴代表时间条,y轴代表两种运行状态

情形1:子线程运行时间< 父线程等待时间 (父线程多等了一会儿,浪费了点时间)

情形2:子线程运行时间>父线程等待时间 (父线程等的时间不够,子线程还没结束,父线程就着急继续往下进行了)

情形3:子线程运行时间==父线程等待时间 (子线程一结束,父线程就继续往下进行)

原文地址:https://www.cnblogs.com/zno2/p/10127775.html