线程的join

155 阅读1分钟
  • 之前只是知道在一个线程中调用了其他线程的join方法会让那个线程执行,自己进行休眠。
  • join是一个实例方法,而且是synchroinzed的。说明进到这个方法拿到了该对象的隐式锁。
  • 上源码
    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) {
            // 如果我们开一个线程来notify也唤醒不了 因为这是个while循环
            while (isAlive()) {
                // 根据之前的知识,拿到锁才能调用wait。确实拿到锁了
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }
  • 那么谁来notify
  • ??????????
  • 一个线程运行结束之后jvm会调用notifyAll。谜团解开
  • 而且join也会释放锁。进入waiting状态