Join方法源码解析

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;
            }
        }
    }

这是最终走进的方法,当isAlive,就wait。注意当前锁住是整个对象。我们在A线程中调用B线程的Join方法,也就是B线程充当了这把锁,但调用者是A线程,也就是说挂起来的是A线程(谁调用wait谁休眠),当B线程还活着,就一直wait,只有当B线程执行完了,才会被唤醒,所以易推测出当B线程执行完毕会有一个收尾工作:使用notify方法,不然A线程就会一直挂着了,此代码可以在JVM源码中看到。

你可能感兴趣的:(Java多线程)