Java多线程中join方法的实现

来源:互联网 发布:学美工一定要会摄影吗 编辑:程序博客网 时间:2024/05/19 03:29

方法join的作用是使所属的线程对象t正常执行run()方法中的任务,而使当前线程z进行阻塞,等待t销毁后再继续执行z后面的代码。

下面贴出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;            }        }    }

    方法join()即调用join(0)。当millis为0时,会不停地判断线程t是否isAlive(),因此,未启动的线程和已经销毁的线程是不会阻塞当前线程的。

    当所属线程t正在运行,在主线程z的cpu时段,会调用Object的wait()方法,该方法首先会取得线程t的锁,然后一直阻塞等待,直到被唤醒,然后继续判断isAlive()。当线程t运行完毕,主线程z获得t的锁,然后跳出while()循环,join方法结束。

    这里需要明白的是,主线程z是怎么被唤醒的。当Thread对象执行start方法完成后,会产生一次thread.notifyAll()方法,此时主线程z被唤醒。

   当线程z在调用t.join方法时,遇到了interrupt()方法,则会停止阻塞,抛出InterruptException异常。