/**
*等待该线程终止的时间最长为 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版权协议,转载请附上原文出处链接和本声明。