1. 程式人生 > >java 執行緒方法join的簡單總結

java 執行緒方法join的簡單總結

雖然關於討論執行緒join方法的部落格已經很多了,不過個人感覺挺多都討論得不夠全面,所以我覺得有必要對其進行一個全面的總結。

  一、作用

  Thread類中的join方法的主要作用就是同步,它可以使得執行緒之間的並行執行變為序列執行。具體看程式碼:

public class JoinTest {
    public static void main(String [] args) throws InterruptedException {
        ThreadJoinTest t1 = new ThreadJoinTest("小明");
        ThreadJoinTest t2 
= new ThreadJoinTest("小東"); t1.start(); /**join的意思是使得放棄當前執行緒的執行,並返回對應的執行緒,例如下面程式碼的意思就是: 程式在main執行緒中呼叫t1執行緒的join方法,則main執行緒放棄cpu控制權,並返回t1執行緒繼續執行直到執行緒t1執行完畢 所以結果是t1執行緒執行完後,才到主執行緒執行,相當於在main執行緒中同步t1執行緒,t1執行完了,main執行緒才有執行的機會 */ t1.join(); t2.start(); } }
class ThreadJoinTest extends Thread{ public ThreadJoinTest(String name){ super(name); } @Override public void run(){ for(int i=0;i<1000;i++){ System.out.println(this.getName() + ":" + i); } } }

上面程式結果是先列印完小明執行緒,在列印小東執行緒;  

上面註釋也大概說明了join方法的作用:在A執行緒中呼叫了B執行緒的join()方法時,表示只有當B執行緒執行完畢時,A執行緒才能繼續執行。注意,這裡呼叫的join方法是沒有傳參的,join方法其實也可以傳遞一個引數給它的,具體看下面的簡單例子:

public class JoinTest {
    public static void main(String [] args) throws InterruptedException {
        ThreadJoinTest t1 = new ThreadJoinTest("小明");
        ThreadJoinTest t2 = new ThreadJoinTest("小東");
        t1.start();
        /**join方法可以傳遞引數,join(10)表示main執行緒會等待t1執行緒10毫秒,10毫秒過去後,
         * main執行緒和t1執行緒之間執行順序由序列執行變為普通的並行執行
         */
        t1.join(10);
        t2.start();
    }

}
class ThreadJoinTest extends Thread{
    public ThreadJoinTest(String name){
        super(name);
    }
    @Override
    public void run(){
        for(int i=0;i<1000;i++){
            System.out.println(this.getName() + ":" + i);
        }
    }
}

上面程式碼結果是:程式執行前面10毫秒內列印的都是小明執行緒,10毫秒後,小明和小東程式交替列印。

所以,join方法中如果傳入引數,則表示這樣的意思:如果A執行緒中掉用B執行緒的join(10),則表示A執行緒會等待B執行緒執行10毫秒,10毫秒過後,A、B執行緒並行執行。需要注意的是,jdk規定,join(0)的意思不是A執行緒等待B執行緒0秒,而是A執行緒等待B執行緒無限時間,直到B執行緒執行完畢,即join(0)等價於join()。

  二、join與start呼叫順序問題

  上面的討論大概知道了join的作用了,那麼,入股 join在start前呼叫,會出現什麼後果呢?先看下面的測試結果

public class JoinTest {
    public static void main(String [] args) throws InterruptedException {
        ThreadJoinTest t1 = new ThreadJoinTest("小明");
        ThreadJoinTest t2 = new ThreadJoinTest("小東");
        /**join方法可以在start方法前呼叫時,並不能起到同步的作用
         */
        t1.join();
        t1.start();
        //Thread.yield();
        t2.start();
    }

}
class ThreadJoinTest extends Thread{
    public ThreadJoinTest(String name){
        super(name);
    }
    @Override
    public void run(){
        for(int i=0;i<1000;i++){
            System.out.println(this.getName() + ":" + i);
        }
    }
}

上面程式碼執行結果是:小明和小東執行緒交替列印。

所以得到以下結論:join方法必須線上程start方法呼叫之後呼叫才有意義。這個也很容易理解:如果一個執行緒都沒有start,那它也就無法同步了。

  三、join方法實現原理

  有了上面的例子,我們大概知道join方法的作用了,那麼,join方法實現的原理是什麼呢?

  其實,join方法是通過呼叫執行緒的wait方法來達到同步的目的的。例如,A執行緒中呼叫了B執行緒的join方法,則相當於A執行緒呼叫了B執行緒的wait方法,在呼叫了B執行緒的wait方法後,A執行緒就會進入阻塞狀態,具體看下面的原始碼:

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方法的原理就是呼叫相應執行緒的wait方法進行等待操作的,例如A執行緒中呼叫了B執行緒的join方法,則相當於在A執行緒中呼叫了B執行緒的wait方法,當B執行緒執行完(或者到達等待時間),B執行緒會自動呼叫自身的notifyAll方法喚醒A執行緒,從而達到同步的目的。

相關推薦

java 執行方法join簡單總結

雖然關於討論執行緒join方法的部落格已經很多了,不過個人感覺挺多都討論得不夠全面,所以我覺得有必要對其進行一個全面的總結。   一、作用   Thread類中的join方法的主要作用就是同步,它可以使得執行緒之間的並行執行變為序列執行。具體看程式碼: public class JoinTest {

執行方法join簡單總結

雖然關於討論執行緒join方法的部落格已經很多了,不過個人感覺挺多都討論得不夠全面,所以我覺得有必要對其進行一個全面的總結。   一、作用   Thread類中的join方法的主要作用就是同步,它可以使得執行緒之間的並行執行變為序列執行。具體看程式碼: public

java進階 執行join用法總結:thread4.join();方法,就表明thread4.join();這個執行受到貴客待遇,直到這個執行執行完,被插入這個方法的載體執行才可以執行

那個執行緒呼叫join 舉例 thread4.join();方法,就表明thread4.join();這個執行緒受到貴客待遇,直到這個執行緒執行完,被插入這個方法的載體執行緒才可以執行。 package javajinjie.char29.threadpool; pu

Java執行join方法

t.join()方法只會使主執行緒進入等待池並等待t執行緒執行完畢後才會被喚醒。 例題1: public class JoinTest { public static void main(String [] args) throws InterruptedExce

執行方法join

xl_echo編輯整理,歡迎轉載,轉載請宣告文章來源。更多IT、程式設計案例、資料請聯絡QQ:1280023003,加群298140694。百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!! 執行緒的方法join,其實就是一個多執行緒相互制約的的行為。如

java執行基礎方面的總結-多執行(一)

1:  同學,解釋一下什麼是執行緒,什麼是程序,我們為什麼要使用多執行緒   我的理解就是程序就是一段可執行的程式,而線相當於執行這段程式中一個可執行的單元     接下來我們從兩個方面解釋為什麼要使用多執行緒減少響應得到時間,我們如果使用單執行緒的話,例如某個操作很耗時間,

UNP多執行程式設計技巧簡單總結

1. 為新執行緒傳遞引數 錯誤程式碼示例: for (i = 0; i < N; i++) { pthread_create(&tid, NULL, &handle, &i); } 噹噹噹,要提問啦!!!

Java執行池的使用總結

  Java中的執行緒池是運用場景最多的併發框架, 幾乎所有需要非同步或併發執行任務的程式都可以使用執行緒池。 在開發過程中, 合理地使用執行緒池能夠帶來3個好處。   第一: 降低資源消耗。 通過

JAVA執行池的簡單實現及優先順序設定

{    privatestatic ThreadPool instance =null;    // 優先順序低publicstaticfinalint PRIORITY_LOW =0;    // 普通publicstaticfinalint PRIORITY_NORMAL =1;    // 高publ

Java執行join

簡述 Thread類的join方法用來使main執行緒進入阻塞狀態,進而等待呼叫join方法的執行緒執行,join有三個過載方法: public final void join() 使主執行緒進

java執行資料共享問題總結

1.執行緒同步,一個關鍵字:synchronized 為什麼有這個東西呢,假如有一個物件,裡面有成員變數和方法,如果有很多執行緒都想訪問它們,有可能造成使用者想避免的結果。 我也舉那個經典的例子:假如你的銀行賬戶裡面有2000塊錢,有一天你去銀行櫃檯取錢,取1500,正在你

Java執行池ThreadPoolExecutor面試總結思維導圖速記

## 優點 *** 1. 降低資源消耗,通過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。 2. 提高響應速度,當任務到達時,可以不需要等待執行緒建立就能立即執行。 3. 提高執行緒的可管理性 ## 類關係 *** 接 Executor 一個無返回值的execute方法 接 ExecutorServ

Java執行join()方法

概要 本章,會對Thread中join()方法進行介紹。涉及到的內容包括: 1. join()介紹 2. join()原始碼分析(基於JDK1.7.0_40) 3. join()示例 來源:http://www.cnblogs.com/skywang12345/p/34792

白話理解java執行join()方法

join字面意思是加入,我理解為插隊. 舉例:媽媽在炒菜,發現沒喲醬油了,讓兒子去打醬油,兒子打完醬油,媽媽炒完菜,全家一起吃 package cn.yh.thread01; /** * * 打醬油的例子 */ public class Demo03 { public stat

Java執行簡單總結

概述 執行緒可認為是作業系統可排程的最小的程式執行序列,一般作為程序的組成部分,同一程序中多個執行緒可共享該程序的資源(如記憶體等)。在單核處理器架構下,作業系統一般使用分時的方式實現多執行緒;在多核處理器架構下,多個執行緒能夠做到真正的在不同處理核心並行處理。

java第18天----生產者消費者,Lock鎖,守護執行join()方法

昨天知識總結: 多執行緒 執行緒的兩種建立方式 建立Thread的子類 執行緒與任務分離 執行緒安全----重點 單例中執行緒安全的應用 執行緒的停止 執行緒 執行緒的通訊 執行緒的通訊: 分析: 需要兩個執行緒—輸入執行緒,和輸

白話理解java執行join()方法

join字面意思是加入,我理解為插隊. 舉例:媽媽在炒菜,發現沒喲醬油了,讓兒子去打醬油,兒子打完醬油,媽媽炒完菜,全家一起吃 package cn.yh.thread01; /** * *

Java執行中yield與join方法的區別

長期以來,多執行緒問題頗為受到面試官的青睞。雖然我個人認為我們當中很少有人能真正獲得機會開發複雜的多執行緒應用(在過去的七年中,我得到了一個機會),但是理解多執行緒對增加你的信心很有用。之前,我討論了一個wait()和sleep()方法區別的問題,這一次,我將會討

JAVA執行join()方法的詳細分析

雖然關於討論執行緒join()方法的部落格已經非常極其特別多了,但是前幾天我有一個困惑卻沒有能夠得到詳細解釋,就是當系統中正在執行多個執行緒時,join()到底是暫停了哪些執行緒,大部分部落格給的例子看起來都像是t.join()方法會使所有執行緒都暫停並等待t的執行完畢。當然

Java執行休眠方法sleep、執行讓步yield和join方法

執行緒休眠(sleep方法) 執行緒休眠:讓執行緒暫緩執行,等到預計時間之後再恢復執行。 執行緒休眠會交出cpu,讓cpu去執行其他任務,但是不會釋放鎖。 比如:當前執行緒sleep休眠了,但是如果此執行緒在休眠前持有某個物件的鎖,那就算它休眠了其他執行緒也不能獲取到這個物件的鎖。