join方法为什么可以做到等待的效果?

以下是join的源码:

public final synchronized void join(long millis)
throws InterruptedException {
    //获取当前时间
    long base = System.currentTimeMillis();
   //用来和join的超时时间做比较,先默认为0
    long now = 0;
    //参数判断,小于0则抛出异常
    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }
    //如果没有设置超时时间
    if (millis == 0) {
       //isAlive()是个本地方法,判断调用join方法的线程是否还存活
        while (isAlive()) {
            //只要还存活,说明线程逻辑还没运行结束,那就把阻塞主线程,把主线程放入子线程对象的等待队列中
            wait(0);
        }
    } else {
       //以下思路一样,只是加了个超时时间参数
        while (isAlive()) {
            long delay = millis - now;
            if (delay <= 0) {
                break;
            }
            wait(delay);
            now = System.currentTimeMillis() - base;
        }
    }
}

第一步思路:主线程调用了(子线程.join)的这步逻辑,所以此时主线程是当前线程。
第二步思路:join方法有synchronized关键字修饰,主线程获取的是谁的锁,子线程对象的锁。
第三步思路:wait()方法是让当前线程进入锁对象的等待队列中。

所以综合以上3步思路,可以得出,只要子线程还在运行,当前线程就会处于阻塞状态,直到子线程运行结束才会被唤醒。

总结

所以哪个线程调用了线程的join方法,哪个线程就会被阻塞,join方法也因此实现了等待的效果。

你可能感兴趣的:(Java并发编程)