激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - java基本教程之join方法詳解 java多線程教程

java基本教程之join方法詳解 java多線程教程

2019-10-31 14:51java教程網 JAVA教程

本文對java Thread中join()方法進行介紹,join()的作用是讓“主線程”等待“子線程”結束之后才能繼續運行,大家參考使用吧

本章涉及到的內容包括:
1. join()介紹
2. join()源碼分析(基于JDK1.7.0_40)
3. join()示例

1. join()介紹
join() 定義在Thread.java中。
join() 的作用:讓“主線程”等待“子線程”結束之后才能繼續運行。這句話可能有點晦澀,我們還是通過例子去理解:

 

復制代碼代碼如下:

// 主線程
public class Father extends Thread {
    public void run() {
        Son s = new Son();
        s.start();
        s.join();
        ...
    }
}
// 子線程
public class Son extends Thread {
    public void run() {
        ...
    }
}

 

說明:
上面的有兩個類Father(主線程類)和Son(子線程類)。因為Son是在Father中創建并啟動的,所以,Father是主線程類,Son是子線程類。
在Father主線程中,通過new Son()新建“子線程s”。接著通過s.start()啟動“子線程s”,并且調用s.join()。在調用s.join()之后,Father主線程會一直等待,直到“子線程s”運行完畢;在“子線程s”運行完畢之后,Father主線程才能接著運行。 這也就是我們所說的“join()的作用,是讓主線程會等待子線程結束之后才能繼續運行”!

2. join()源碼分析(基于JDK1.7.0_40)

復制代碼代碼如下:


public final void join() throws InterruptedException {
    join(0);
}

 

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

 

說明:
從代碼中,我們可以發現。當millis==0時,會進入while(isAlive())循環;即只要子線程是活的,主線程就不停的等待。
我們根據上面解釋join()作用時的代碼來理解join()的用法!
問題:
雖然s.join()被調用的地方是發生在“Father主線程”中,但是s.join()是通過“子線程s”去調用的join()。那么,join()方法中的isAlive()應該是判斷“子線程s”是不是Alive狀態;對應的wait(0)也應該是“讓子線程s”等待才對。但如果是這樣的話,s.join()的作用怎么可能是“讓主線程等待,直到子線程s完成為止”呢,應該是讓"子線程等待才對(因為調用子線程對象s的wait方法嘛)"?
答案:wait()的作用是讓“當前線程”等待,而這里的“當前線程”是指當前在CPU上運行的線程。所以,雖然是調用子線程的wait()方法,但是它是通過“主線程”去調用的;所以,休眠的是主線程,而不是“子線程”!

3. join()示例
在理解join()的作用之后,接下來通過示例查看join()的用法。

 

復制代碼代碼如下:


// JoinTest.java的源碼
public class JoinTest{

 

    public static void main(String[] args){ 
        try {
            ThreadA t1 = new ThreadA("t1"); // 新建“線程t1”

            t1.start();                     // 啟動“線程t1”
            t1.join();                        // 將“線程t1”加入到“主線程main”中,并且“主線程main()會等待它的完成”
            System.out.printf("%s finish\n", Thread.currentThread().getName()); 
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static class ThreadA extends Thread{

        public ThreadA(String name){ 
            super(name); 
        } 
        public void run(){ 
            System.out.printf("%s start\n", this.getName());

            // 延時操作
            for(int i=0; i <1000000; i++)
               ;

            System.out.printf("%s finish\n", this.getName()); 
        } 
    } 
}

 

運行結果:

復制代碼代碼如下:

t1 start
t1 finish
main finish


結果說明:
運行流程如圖 
(01) 在“主線程main”中通過 new ThreadA("t1") 新建“線程t1”。 接著,通過 t1.start() 啟動“線程t1”,并執行t1.join()。
(02) 執行t1.join()之后,“主線程main”會進入“阻塞狀態”等待t1運行結束。“子線程t1”結束之后,會喚醒“主線程main”,“主線程”重新獲取cpu執行權,繼續運行。

java基本教程之join方法詳解 java多線程教程

延伸 · 閱讀

精彩推薦
657
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 久久久久久久久日本理论电影 | 黄色日韩网站 | 精品国产一区二区三区成人影院 | 一本色道久久99精品综合蜜臀 | 亚洲尻逼视频 | 91精品国产综合久久男男 | 欧美一级黄 | 国产亚洲精品久久久久婷婷瑜伽 | chinesehdxxxx无套 2021国产精品 | 韩国一级免费视频 | 国产网站黄 | 亚洲精品久久久久www | 99ri在线 | 夜夜夜影院 | 国产精品一区二区日韩 | 国产成人在线视频播放 | 国产精品手机在线亚洲 | 国产成人羞羞视频在线 | 久久久免费观看完整版 | 最新在线中文字幕 | 精品国产精品久久 | 欧美人与禽性xxxxx杂性 | 毛片一级片 | 久久精品亚洲一区二区三区观看模式 | 巨乳激情| 91成| 久久精品亚洲一区二区三区观看模式 | 全黄裸片武则天一级第4季 九色p | 国产亚洲高清在线精品不卡 | 97精品视频在线观看 | 久久精品99国产国产精 | 成年人视频在线免费播放 | 国产精品久久久久久久久久尿 | 国产亚洲在线 | 人人做人人看 | 久久999久久| 毛片毛片免费看 | 国产亚洲精品精 | 久久亚洲线观看视频 | 欧美黑人伦理 | 国产午夜精品久久久久久免费视 |