使用join();

public class Main{
    public static void main(String[] args) {
        Thread T1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(1111);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        T1.start();

        Thread T2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    T1.join();
                    System.out.println(2222);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        T2.start();

        Thread T3 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    T2.join();
                    System.out.println(3333);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        T3.start();
    }
}

join()的作用?

Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。当我们调用某个线程的这个方法时,这个方法会挂起调用线程,直到被调用线程结束执行,调用线程才会继续执行。

join方法传参和不传参的区别:

join方法中如果传入参数,则表示这样的意思:如果A线程中掉用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。 需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。

join与start调用顺序

join方法必须在线程start方法调用之后调用才有意义。这个也很容易理解:如果一个线程都没有start,那它也就无法同步了。因为执行完start方法才会创建线程。

join方法实现原理

深入底层:join()调用了join(0),而join(final long millis)是一个synchronized 的同步方法,join(final long millis)调用了wait方法来实现。 是怎么通过wait()来实现join的呢? 举个例子,join是在main方法里被调用了。 然后main方法就持有了 join方法 的 这个锁。 然后join 方法里面调用了 wait方法。 这个过程的目的是让持有这个同步锁的线程进入等待。 那么谁持有了这个同步锁呢? 答案就是main方法,因为main方法调用了join方法。 main方法就持有 synchronized 标记的这个锁,谁持有这个锁谁就等待。 wait()方法只会让持有锁的线程进入等待,而启动线程的 start() 并没有持有锁,所以 strat方法还是会执行,而join方法中的wait方法 使main 方法等待了。 所以main方法就没有获取到CPU资源, 所以main方法中的 thread2 就没有办法获取CPU资源。 然后join方法执行完之后,不用想,JVM底层肯定执行了 notify的操作。