java 線程 join(wait) 后,是如何喚醒


概要:鎖是線程,鎖對象執行完畢后,會調用自身對象上的notify();

Join 方法:本質上還是根據wait方法實現的。分析join源碼發現join方法本身是使用了synchronized修飾符的。是加在方法上面的,意味着。 獲取了當前對象的鎖,然后繼續發現里面的代碼調用了wait。意味着我們先鎖,再釋放,等待喚醒,什么情況下被喚醒呢:

 

仔細查看join的源碼,發現調用了wait(0),讓程序等待,那么什么時間鎖被釋放呢?。因為是以線程對象作為鎖的:

After run() finishes, notify() is called by the Thread subsystem.

 

當線程運行結束的時候,notify是被線程的子系統調用的

 

分別以普通對象和線程對象作為鎖,當使用線程對象作為所得時候,如果鎖對象執行完畢了。wait就會停止等待繼續執行

 

public class ThreadTestl {
    public static void main(String[] args) {

        final MyLockThread o = new MyLockThread();

        //final Object oo = new Object();
        new Thread(new Runnable() {

            @Override
            public void run() {
                synchronized (o) {
                    System.err.println(1);
                    try {
                        o.wait(0);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.err.println(2);
                }
            }
        }).start();

        o.start();
    }

    static class MyLockThread extends Thread {

        public MyLockThread() {
        }

        @Override
        public void run() {
            System.err.println("MyLockThread");
        }

    }
}

 

 

 

java join后如何喚醒


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM