Java並發:join與wait


  Thread.join中使用Object.wait實現:

  //java.lang.Thread

    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;
            }
        }
    }

  wait方法,jdk文檔中的解釋時:Causes the current thread to wait ,wait方法會讓當前線程從runnable變成waitting的狀態。怎么理解這句話呢?首先每個對象都可以作為一個鎖,wait方法是根類Object的方法,每個對象都有其wait方法,在main方法中執行如下代碼:

public class Program{
    public static void main(String[] args) throws Exception{
        MyThread myThread = new Thread(new Runnable(){
            @Override
            public void run() {
                //this就是當前對象myThread,同步獲取到myThread鎖
                synchronized (this) {
                    this.notify();//喚醒在myThread鎖上等待的單個線程。即main主線程從waitting變成runnable,main方法繼續執行
                }
            }
        });
        myThread.setName("myThread");
        myThread.start();
        //同步獲取到myThread鎖
        synchronized (myThread) {
            //使當前線程(main)從runnable進入waitting狀態,等待其他某個線程調用myThread鎖的 notify方法
            myThread.wait();
        }
}

  myThread對象就是一個鎖,main方法synchronized (myThread)獲取到鎖,並執行該鎖的wait方法,使main線程一直等待,當線程MyThread中獲取同一個鎖,並執行該鎖的notify方法,使之前因該鎖等待main方法可以繼續執行。


免責聲明!

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



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