Thread.join 源码

来源:互联网 发布:海口数据共享交换平台 编辑:程序博客网 时间:2024/05/01 03:54

在AThread的run方法里,执行了bt.join();,进入看一下它的JDK源码:

public final void join() throws InterruptedException {    join(0L);}

然后进入join(0L)方法:

public final synchronized void join(long l)    throws InterruptedException{    long l1 = System.currentTimeMillis();    long l2 = 0L;    if(l < 0L)        throw new IllegalArgumentException("timeout value is negative");    if(l == 0L)        for(; isAlive(); wait(0L));    else        do        {            if(!isAlive())                break;            long l3 = l - l2;            if(l3 <= 0L)                break;            wait(l3);            l2 = System.currentTimeMillis() - l1;        } while(true);}

单纯从代码上看: * 如果线程被生成了,但还未被起动,isAlive()将返回false,调用它的join()方法是没有作用的。将直接继续向下执行。 * 在AThread类中的run方法中,bt.join()是判断bt的active状态,如果bt的isActive()方法返回false,在bt.join(),这一点就不用阻塞了,可以继续向下进行了。从源码里看,wait方法中有参数,也就是不用唤醒谁,只是不再执行wait,向下继续执行而已。 * 在join()方法中,对于isAlive()和wait()方法的作用对象是个比较让人困惑的问题:

isAlive()方法的签名是:public final native boolean isAlive(),也就是说isAlive()是判断当前线程的状态,也就是bt的状态。

0 0
原创粉丝点击