并发编程-join源码分析

1、测试Thread.join()方法代码如下

public static void main(String[] args) throws InterruptedException {
        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
        System.out.println(""+sdf.format(new Date()));
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    System.out.println("执行t线程");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
        try {
            t.join();
            System.out.println("=========main线程执行完成========="+sdf.format(new Date()));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

}

2、查看join方法,发现底层通过synchronized+while(isAlive())循环判断t线程存活状态+Object.wait() 实现

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) {
            //通过isAlive()循环判断Thread对象t的存活状态,直到t线程死亡
            while (isAlive()) {
                //1、调用Object.wait(0)方法释放锁,线程进入阻塞状态,等待获取锁
        //2、阻塞状态线程抢占锁成功后,继续通过isAlive()循环判断Thread对象t的存活状态  
            //2.1、线程存活,调用Object.wait(0)方法释放锁,线程进入阻塞状态,等待获取锁
        //2.2、线程死亡,继续执行等待线程的逻辑
        wait(0);
            }
        } else {
            //通过isAlive()循环判断Thread对象t的存活状态,直到t线程死亡,     
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                //1、调用Object.wait(delay)方法线程进入TIMED_WAIT状态,等待delay时间后,线程进入阻塞状态,等待获取锁
        //2、被阻塞的线程获取到锁后,继续通过isAlive()循环判断Thread对象t的存活状态,直到t线程死亡
        //2.1、线程存活,则继续调用Object.wait(delay)方法线程进入TIMED_WAIT状态,等待delay时间后,线程进入阻塞状态,等待获取锁
        //2.2、线程死亡,则执行等待线程的下面逻辑
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
}

 

posted @ 2023-07-02 12:16  西风51668  阅读(31)  评论(0)    收藏  举报