java的join()方法

weixin_34185560發表於2018-08-14

對於join()方法導致當前執行緒等待,很多人想知道如何實現。但是,當看下面join原始碼的時候,覺得呼叫的是th1的wait,所以是th1等待,怎麼會是當前執行緒等待呢?

public class Main{
    
    public static void main(String[] args)  {
        Thread th1 = new Thread("1"){
            public void run(){
                //
            }
        };
        th1.start();
        th1.join();
        
    }
}

請仔細看下面原始碼.其實造成當前執行緒等待是因為上面while(isAlive())迴圈,while結束就執行當前執行緒,但每次th1還活著就會呼叫wait(0),意思是釋放鎖0秒後喚醒自己。所以th1執行緒看似wait了,實際上是不斷的wait->runnable的過程。可以看出,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方法會是當前執行緒進入waiting狀態

public class ThreadSample{
    public static void main(String... arg) {
        Thread th1 = new Thread("1"){
            public void run(){
                Thread th2 = new Thread("2"){
                    public void run(){
                        while(true){
                            
                        }
                    }
                };
                th2.start();
                try {
                    th2.join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        th1.start();
        
    }
}
2244738-247f64282df97776.png
微信圖片1.png

相關文章