1. 程式人生 > >Java中join()方法的理解

Java中join()方法的理解

thread.Join把指定的執行緒加入到當前執行緒,可以將兩個交替執行的執行緒合併為順序執行的執行緒。

比如線上程B中呼叫了執行緒A的Join()方法,直到執行緒A執行完畢後,才會繼續執行執行緒B。

t.join();      //呼叫join方法,等待執行緒t執行完畢
t.join(1000);  //等待 t 執行緒,等待時間是1000毫秒。

下面是一段JDK中的程式碼:

複製程式碼
    /**
     *  Waits at most <code>millis</code> milliseconds for this thread to  
     * die. A timeout of <code>0</code> means to wait forever.    
     
*/ 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() 方法是沒有作用的,將直接繼續向下執行

Join方法實現是通過wait(小提示:Object 提供的方法)。 當main執行緒呼叫t.join時候,main執行緒會獲得執行緒物件t的鎖(wait 意味著拿到該物件的鎖),呼叫該物件的wait(等待時間),直到該物件喚醒main執行緒 ,比如退出後。這就意味著main 執行緒呼叫t.join時,必須能夠拿到執行緒t物件的鎖

通過下面一段程式碼解釋:

複製程式碼
package ThreadTest;

import static java.lang.Thread.currentThread;
import static java.lang.Thread.sleep;

/**
 * Created with IntelliJ IDEA.
 * User: Blank
 * Date: 14-3-28
 * Time: 下午7:49
 */
public class TestJoin implements Runnable {


    public static void main(String[] sure) throws InterruptedException {
        Thread t = new Thread(new TestJoin());
        long start = System.currentTimeMillis();
        t.start();
        t.join(1000);//等待執行緒t 1000毫秒
        System.out.println(System.currentTimeMillis()-start);//打印出時間間隔
        System.out.println("Main finished");//列印主執行緒結束
    }

    @Override
    public void run() {
       // synchronized (currentThread()) {
            for (int i = 1; i <= 5; i++) {
                try {
                    sleep(1000);//睡眠5秒,迴圈是為了方便輸出資訊
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("睡眠" + i);
            }
            System.out.println("TestJoin finished");//t執行緒結束
        }
    //}
}
複製程式碼

在註釋掉synchronized修飾的run方法後,列印資訊如下:

可以看到main執行緒等待了t執行緒1000毫秒之後,結束了,隨後是t執行緒列印的資料。

那麼如果加上run方法的synchronized那條語句呢?結果如下:

由於先呼叫了t.start()方法,執行緒進入synchronized程式碼段,main執行緒等待一秒以後,還是得不到執行緒t的物件鎖,只能繼續等待,直到執行緒t結束,釋放鎖。這裡可以明確看到main執行緒等待時間是5000ms,有些文章裡寫的是t執行緒執行時間+join方法指定的時間(5000+1000 ),其實不是的,這裡可以很清晰的看到,main執行緒等待時間只有5000ms,看到有的文章說join呼叫的wait也是需要獲取物件鎖的。

JDK原始碼中wait操作是

public final native void wait(long timeout) throws InterruptedException;

wait內部實現應該是用synchronized,等待時間是5000+1000就好解釋了,搞不明白。

此處存疑。

轉自: http://www.cnblogs.com/aboutblank/p/3631453.html

相關推薦

Javajoin()方法理解

thread.Join把指定的執行緒加入到當前執行緒,可以將兩個交替執行的執行緒合併為順序執行的執行緒。 比如線上程B中呼叫了執行緒A的Join()方法,直到執行緒A執行完畢後,才會繼續執行執行緒B。 t.join();      //呼叫join方法,等待執行緒t執

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

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

Java多執行緒join方法理解

[CustomThread1] Thread start.      //執行緒CustomThread1起動 [CustomThread1] Thread loop at 0   //執行緒CustomThread1執行 [CustomThread1] Thread loop at 1   //執行緒Cu

JavaJava多執行緒join方法理解

[CustomThread1] Thread start.      //執行緒CustomThread1起動 [CustomThread1] Thread loop at 0   //執行緒CustomThread1執行 [CustomThread1] Thread loop at 1   //執行緒Cu

Pythonjoin()方法Java實現

Python中join()方法可以便捷的實現字串的拼接,例如 chars = ['S', 'a', 'f', 'e'] print( ','.join(chars)) #output : S,a,f,e 但今天嘗試Java的字串按照上面的格式輸出,程式改來改去都覺得

javaclone方法理解(深拷貝、淺拷貝)

前言: java中的clone一直是一個老生常談的問題,另外關於克隆網上也有很多的寫過這方面的問題。 我在這裡記錄一下我遇到的問題和使用clone的方法。 知識點一:什麼是淺拷貝? 我們這裡說的淺拷貝是指我們拷貝出來的物件內部的引用型別

java繼承的理解,super關鍵字,方法的重寫和過載以及注意事項理解

一、類的繼承理解 在java中類的繼承是指:在一個現有類的基礎之上去構建一個新的類,構建出來的新的類被稱為子類,現有類是父類,子類會自動擁有父類所有可繼承的屬性和方法。繼承類是現有類的更具體一些,繼承類可能只擁有一部分父類的屬性和方法。 如圖,這就表示了繼承類是父類的一種更具體形式

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

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

如何理解java方法

1:方法(掌握) (1)方法:就是完成特定功能的程式碼塊。 注意:在很多語言裡面有函式的定義,而在Java中,函式被稱為方法。 (2)格式: 修飾符 返回值型別 方法名(引數型別 引數名1,引數型別 引數名2...) { 方法體語句; return 返回值;

java包的理解,普通類、抽象類、介面作為方法引數傳值情況,作為返回值的傳遞情況。

一、包的概念 用於存放類檔案,包含原始檔還有.class檔案。通過包的分類管理讓功能相同的類放在一個資料夾裡。作用:為類檔案進行分類管理。 二、包的宣告格式 通常使用公司網址反寫。包名全部採用小寫字母。多層包用.連線。包的宣告必須在有效程式碼的第一行。 導包: impo

java構造方法理解,super()與構造方法,無參,有參構造方法,this()與構造方法

一、為什麼要引入構造方法。 當建立物件的時候需要對屬性值初始化,構造方法,即物件建立時要執行的方法。 要求在例項化的同時,就指定好name,和age的值。這就要用到構造方法。又叫做構造器Constructor. 二、構造方法的定義格式 構造方法在new的時候自動執行。且只執

Java多執行緒join方法的實現

方法join的作用是使所屬的執行緒物件t正常執行run()方法中的任務,而使當前執行緒z進行阻塞,等待t銷燬後再繼續執行z後面的程式碼。 下面貼出join方法的原始碼: public final synchronized void join(long millis)

java方法

允許 多個 != 返回值 如果 系統底層 所在 格式 影響 方法的概念: 簡單的說方法就是完成特定功能的代碼塊 使用方法的好處: 降低程序的冗余度 , 便於後期維護 , 提高封裝性 方法的定義格式修飾符 返回值類型 方法名(數據類型 參數名1,數據類型 參數名2,.

java類的理解

ros family mic 數據 microsoft ava span -s 類型 1.Java總除了8種基本數據類型之外,其余的所有類型都是以類的的方式定義。 2.類不同於基本數據類型。要使用new關鍵字創建一個類的對象,然後使用一個引用指向創建對象。 3.引用指向對象

javanative方法的使用

cat 語言 pub jvm 配置 his fde 應用程序 nic native關鍵字說明其修飾的方法是一個原生態方法,方法對應的實現不是在當前文件,而是在用其他語言(如C和C++)實現的文件中。Java語言本身不能對操作系統底層進行訪問和操作,但是可以通過JNI接口調用

Java通過方法創建一個http連接並請求

servlet 讀取 mage equals contex method ade temp password 1.Java代碼創建一個連接並請求該連接返回的數據 doGet()方法,execute()方法中調用 package demo2.x.com;

Javasynchronized關鍵字理解

監視器 pre 定義 exc 執行 zed 三種 gen 好記性不如爛筆頭 好記性不如爛筆頭~~ 並發編程中synchronized關鍵字的地位很重要,很多人都稱它為重量級鎖。利用synchronized實現同步的基礎:Java中每一個對象都可以作為鎖。具體表現為以下三種形

Javahashcode的理解

instance 論壇 區分 instant hset col 又一 guid ray Java中hashcode的理解 原文鏈接http://blog.cs

Java方法覆蓋(Overriding)和方法重載(Overloading)是什麽意思?

沒有 編譯錯誤 列表 限制 值類型 條件 IV 什麽 java   方法覆蓋也稱為重寫,重寫即子類重新定義了父類的方法。 重寫:   1、重寫的方法必須與原方法有相同的方法名、參數列表和返回值類型(Java SE5之後返回值類型可以是其類型的子類型)   2、被重寫的方法不

Java構造方法、實例方法、類方法的區別

而在 class syn 此外 alt 創建 子類 語法規則 自身 1. 構造方法 構造方法負責對象的初始化工作,為實例變量賦予合適的初始值。必須滿足以下的語法規則: 方法名與類名相同; 不要返回類型(例如return、void等); 不能被