Thread之三 Thread Join 的用法

2021-09-07 04:16:16 字數 2852 閱讀 4810

join()和wait()不會釋放鎖,join()是thread的方法,wait()是object的方法

1.join方法定義在thread類中,則呼叫者必須是乙個執行緒

例如:

thread t = new customthread();//這裡一般是自定義的執行緒類

t.start();//執行緒起動

t.join();//此處會丟擲interruptedexception異常

2.上面的兩行**也是在乙個執行緒裡面執行的

以上出現了兩個執行緒,乙個是我們自定義的執行緒類,我們實現了run方法,做一些我們需要的工作;另外乙個執行緒,生成我們自定義執行緒類的物件,然後執行

customthread.start();

customthread.join();

在這種情況下,兩個執行緒的關係是乙個執行緒由另外乙個執行緒生成並起動,所以我們暫且認為第乙個執行緒叫做「子執行緒」,另外乙個執行緒叫做「主線程」。

二、為什麼要用join()方法

主線程生成並啟動了子執行緒,而子執行緒裡要進行大量的耗時的運算(這裡可以借鑑下執行緒的作用),當主線程處理完其他的事務後,需要用到子執行緒的處理結果,這個時候就要用到join();方法了。

三、join方法的作用

「等待該執行緒終止。」

解釋一下,是主線程等待子執行緒的終止。也就是說主線程的**塊中,如果碰到了t.join()方法,此時主線程需要等待(阻塞),等待子執行緒結束了(waits for this thread to die.),才能繼續執行t.join()之後的**塊。

class bthread extends

thread ;

public

void

run()

system.out.println(threadname + " end.");

} catch

(exception e)

}}class athread extends

thread

public

void

run()

catch

(exception e)

}}public

class

testdemo

catch

(exception e)

system.out.println(threadname + " end!");

}}

結果:

main start.    //

主線程起動,因為呼叫了at.join(),要等到at結束了,此執行緒才能向下執行。

[bthread] thread start.

[bthread] thread loop at 0[bthread] thread loop at 1[athread] thread start.

//執行緒at啟動,因為呼叫bt.join(),等到bt結束了才向下執行。

[bthread] thread loop at 2[bthread] thread loop at 3[bthread] thread loop at 4[bthread] thread end.

[athread] thread end.

//執行緒athread在bt.join();阻塞處啟動,向下繼續執行的結果

main end! //

執行緒athread結束,此執行緒在at.join();阻塞處啟起動,向下繼續執行的結果。

修改一下**:

public

class

testdemo catch

(exception e)

system.out.println(threadname + " end!");

}}

結果:

main start.    //

主線程起動,因為thread.sleep(2000),主線程沒有馬上結束;

[bthread] thread start.

//執行緒bthread起動

[bthread] thread loop at 0[bthread] thread loop at 1main end! //

在sleep兩秒後主執行緒結束,athread執行的bt.join();並不會影響到主線程。

[athread] thread start. //

執行緒at起動,因為呼叫了bt.join(),等到bt結束了,此執行緒才向下執行。

[bthread] thread loop at 2[bthread] thread loop at 3[bthread] thread loop at 4[bthread] thread end.

//執行緒bthread結束了

[athread] thread end. //

執行緒athread在bt.join();阻塞處起動,向下繼續執行的結果

在athread的run方法裡,執行了bt.join();,進入看一下它的jdk原始碼:

public

final

void join() throws

interruptedexception

public

final

synchronized

void join(long

l)

throws

interruptedexception

while(true

); }

Thread(執行緒)三

今天我們繼續接著執行緒講講,上一章提到一下task概念,首先接著task繼續往下講,在前章節提到過thread怎麼實現其他執行緒完成後再讓主線程繼續執行的功能,那麼如果task也需要執行緒等待事件,該怎麼實現呢?在這裡介紹四種方法。1 continuewhenany方法 taskfactory.co...

mysql設計之三正規化 MySQL設計之三正規化

資料庫設計三正規化 設計資料庫表的時候所依據的規範,共三個規範 第一正規化 要求有主鍵,並且要求每乙個字段原子性不可再分 第二正規化 要求所有非主鍵字段完全依賴主鍵,不能產生部分依賴 第三正規化 所有非主鍵欄位和主鍵字段之間不能產生傳遞依賴 第一正規化 資料庫表中不能出現重覆記錄,每個欄位是原子性的...

C C 指標之三

指標變數的賦值運算有以下幾種形式 int a int ip a int a int ip ip a 把整型變數 a的位址賦予整型指標變數 ipint a int pa a int pb pb pa 把a 的位址賦予指標變數pb 由於pa,pb均為指向整型變數的指標變數,因此可以相互賦值。int a ...