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 extendsthread ;
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();阻塞處啟起動,向下繼續執行的結果。
修改一下**:
publicclass
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原始碼:
publicfinal
void join() throws
interruptedexception
publicfinal
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 ...