Thread.join()源码分析

/**
 *等待该线程终止的时间最长为 millis 毫秒。超时为 0 意味着要一直等下去。
 *millis - 以毫秒为单位的等待时间。
 */
public final synchronized void join(long millis) 
throws InterruptedException {
	//获取启动时的时间戳,用于计算当前时间
	long base = System.currentTimeMillis();
   	//当前时间
	long now = 0;

    if (millis < 0) {//等待时间不能小于0则抛出IllegalArgumentException
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (millis == 0) {//等待时间为0,则无限等待
		//需要注意,如果当前线程未被启动或者终止,则isAlive方法返回false
		//即意味着join方法不会生效
        while (isAlive()) {
            wait(0);
        }
    } else {
		//需要注意,如果当前线程未被启动或者终止,则isAlive方法返回false
		//即意味着join方法不会生效
        while (isAlive()) {
			//计算剩余的等待时间
            long delay = millis - now;
            if (delay <= 0) {//如果剩余的等待时间小于等于0,则终止等待
                break;
            }
			//等待指定时间
            wait(delay);
			//获取当前时间
            now = System.currentTimeMillis() - base;
        }
    }
}

版权声明:本文为lutw9801原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。