1. 程式人生 > >新blog:http://www.blogjava.net/jnbzwm/

新blog:http://www.blogjava.net/jnbzwm/

一、在研究join的用法之前,先明確兩件事情

1.join方法定Thread中,則調用者必是一個程,

例如:

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

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

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

2.上面的兩行程式碼也是在一個執行緒裡面執行的。

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

customThread.start();

customThread.join();

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

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

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

三、join方法的作用

在網上看到有人說“將兩個執行緒合併”。這樣解釋我覺得理解起來還更麻煩。不如就借鑑下API裡的說法:

“等待該執行緒終止。”

解釋一下,是主執行緒(我在“一”裡已經命名過了)等待子執行緒的終止。也就是在子執行緒呼叫了

join()方法後面的程式碼,只有等到子執行緒結束了才能執行。(Waits for this thread to die.)

四、用例項來理解

寫一個簡單的例子來看一下join()的用法,一共三個類:

1.CustomThread

2. CustomThread1

3. JoinTestDemo 類,main方法所在的類。

程式碼1

列印結果:

main start.//main方法所在的執行緒起動,但沒有馬上結束,因為呼叫t.join();,所以要等到t結束了,此執行緒才能向下執行。

[CustomThread1] Thread start.//執行緒CustomThread1起動

[CustomThread1] Thread loop at 0//執行緒CustomThread1執行

[CustomThread1] Thread loop at 1//執行緒CustomThread1執行

[CustomThread] Thread start.//執行緒CustomThread起動,但沒有馬上結束,因為呼叫t1.join();,所以要等到t1結束了,此執行緒才能向下執行。

[CustomThread1] Thread loop at 2//執行緒CustomThread1繼續執行

[CustomThread1] Thread loop at 3//執行緒CustomThread1繼續執行

[CustomThread1] Thread loop at 4//執行緒CustomThread1繼續執行

[CustomThread1] Thread end. //執行緒CustomThread1結束了

[CustomThread] Thread end.// 執行緒CustomThreadt1.join();阻塞處起動,向下繼續執行的結果

main end!//執行緒CustomThread結束,此執行緒在t.join();阻塞處起動,向下繼續執行的結果。

修改一下程式碼,得到程式碼2:(這裡只寫出修改的部分)

列印結果:

main start. // main方法所在的執行緒起動,但沒有馬上結束,這裡並不是因為join方法,而是因為Thread.sleep(2000);

[CustomThread1] Thread start. //執行緒CustomThread1起動

[CustomThread1] Thread loop at 0//執行緒CustomThread1執行

[CustomThread1] Thread loop at 1//執行緒CustomThread1執行

main end!// Thread.sleep(2000);結束,雖然線上程CustomThread執行了t1.join();,但這並不會影響到其他執行緒(這裡main方法所在的執行緒)

[CustomThread] Thread start. //執行緒CustomThread起動,但沒有馬上結束,因為呼叫t1.join();,所以要等到t1結束了,此執行緒才能向下執行。

[CustomThread1] Thread loop at 2//執行緒CustomThread1繼續執行

[CustomThread1] Thread loop at 3//執行緒CustomThread1繼續執行

[CustomThread1] Thread loop at 4//執行緒CustomThread1繼續執行

[CustomThread1] Thread end. //執行緒CustomThread1結束了

[CustomThread] Thread end. // 執行緒CustomThreadt1.join();阻塞處起動,向下繼續執行的結果

五、從原始碼看join()方法

CustomThreadrun方法裡,執行了t1.join();,進入看一下它的JDK原始碼:

然後進入join(0)方法:

單純從程式碼上看,如果執行緒被生成了,但還未被起動,呼叫它的join()方法是沒有作用的。將直接繼續向下執行,這裡就不寫程式碼驗證了。

相關推薦

blog:http://www.blogjava.net/jnbzwm/

一、在研究join的用法之前,先明確兩件事情。 1.join方法定義在Thread類中,則調用者必須是一個線程, 例如: Thread t = new CustomThread();//這裡一般是自定義的執行緒類 t.start();//執行緒起動 t.join();//此

反編譯java class並優雅的除錯--http://www.blogjava.net/miaoyachun/archive/2013/02/22/395575.html

https://sourceforge.net/projects/realignmentjd/files/ 官方文件 用jd-eclipse 外掛來反編譯java class檔案的輸出還是挺nice的,雖然閱讀方便了 但是對debug確造成一定的困擾,主要問題是line

http://www.blogjava.net/woxingwosu/archive/2008/01

Java克隆Clone ☆什麼是Clone Clone就是得到一個物件x的副本,而且x.clone() != x。Clone分為兩種:淺度克隆Shallow Clone和淺度克隆Deep Clone Object類有clone()方法: prote

Tisty的兵工廠--Blog:http://www.UbuntuSky.cn

導讀: 刪除表和截斷表命令之間的區別是什麼? 此問題提交於2004年11月23日  表刪除包括表的定義和關聯物件(規則、索引、約、觸發器、主鍵,等)。很明顯,一旦表被刪除,那麼表中包含的所有的資料行都會被一同刪除。   truncate 截斷表命令還會回收所有索引的分配頁。

我的blog:<http://nokiaguy.blogjava.net> <http://nokiaguy.cnblogs.com>

  Tomcat 5可以通過以執行在網頁瀏覽器的配置應用程式非常方便地進行伺服器的配  置。這個應用程式稱為Tomcat Administration Web Application。然而,Tomcat 5.5 以後的binary 核心安裝版不再提供Tomcat Admini

<轉載> MySQL 性能優化的最佳20多條經驗分享 http://www.jb51.net/article/24392.htm

構造 進程 還需 query 情況 關聯表 string類型 優化技巧 fix 當我們去設計數據庫表結構,對操作數據庫時(尤其是查表時的SQL語句),我們都需要註意數據操作的性能。這裏,我們不會講過多的SQL語句的優化,而只是針對MySQL這一Web應用最多的數據庫。希望下

http://www.52lf.net

從三個方面來說:首先要宣告的一點它們都是語言結構,不是函式一、速度echo/print在一般使用中表現是一樣的,但它們會有細微不同,echo不返回數,print會返回值(這是區別之一),所以echo速度要快二、表現方式正是因為print有返回值,所以它可以用它表示複雜的表示式

Siney的BlOG http://www.sineysoft.com

D0-D7為資料線, S0-S7為狀態線, 但是S0,S1,S2是看不見的(從圖中你也可以看出), 狀態線是用來讀取資料的, 但S0卻不同, 它是超時標誌位, 其他的狀態線從第10-11-12-13-15針是用來發送資料的(可以看出是5位). 那麼我們怎麼能得到這些資料埠呢? 很簡單: 每一個並口都有一個地址

面向站長和網站管理員的Web快取加速指南[翻譯] 原文(英文)地址: http://www.mnot.net/cache_docs/ 版權宣告:署名-非商業性使用-禁止演繹 2.0 這是一篇知識性

什麼是Web快取,為什麼要使用它? Web快取位於Web伺服器之間(1個或多個,內容源伺服器)和客戶端之間(1個或多個):快取會根據進來的請求儲存輸出內容的副本,例如html頁面, 圖片,檔案(統稱為副本),然後,當下一個請求來到的時候:如果是相同的URL,快取直接使用副本響應訪問請求,而不是向源伺服器再次

可算找到組織了!可算見到同志了!!我之前在BLOGCN上有個BLOG: http://johnnny_jiang.blogone.net/

我在這裡感到特別的親切啊!!只是相見恨晚啊!!以後我的BLOG就同時在這兩個地方釋出了!^o^我現在在做我的畢業設計(一個嵌入式多工實時作業系統)。正在做前期的技術沉澱和總體設計與資料字典的編制。歡迎到我BLOGCN的日

【zylzb的專欄】該部落格使用部落格搬家功能從http://haohaoxuexi.iteye.com搬遷過來,發現搬遷過來的效果不好,決定陸續手動搬遷到地址http://blog.csdn.net/elim168

該部落格使用部落格搬家功能從http://haohaoxuexi.iteye.com搬遷過來,發現搬遷過來的效果不好,決定陸續手動搬遷到新地址http://blog.csdn.net/elim168...

項目上線,河馬體育(http://www.hemaj.com)-足球即時比分、足球比分、足球比分直播、足球直播

以及 陌生人 足球 get 數據分析 新項目 認識 愛好 體育彩票 河馬體育提供免費足球即時比分、籃球比分、球迷聊天室,為中國體育彩票、競彩彩民以及體育愛好者提供最專業的數據分析、預測。 河馬體育是即時比分和線聊天網站,你可以馬上跟一群互不認識的陌生人聊體育。通過文字逐漸相

博客地址:http://www.yangqs.com

博客新博客地址:http://www.yangqs.com 歡迎大家繼續關註!本文出自 “強生的博客” 博客,請務必保留此出處http://yangqs.blog.51cto.com/127876/1934732新博客地址:http://www.yangqs.com

用法:<meta http-equiv="Refresh" content="2;URL=http://www.webjx.com"> 說明:自動重新整理並指向頁面。

     http-equiv顧名思義,相當於http的檔案頭作用,它可以向瀏覽器傳回一些有用的資訊,以幫助正確和精確地顯示網頁內容,與之對應的屬性值為content,content中的內容其實就是各個引數的變數值。 meat標籤的http-equiv屬性語法

安裝的Ubuntu在使用sudo apt-get update更新原始碼的時候出現如下錯誤: W: GPG 錯誤:http://ppa.launchpad.net precise Release:

新安裝的Ubuntu在使用sudo apt-get update更新原始碼的時候出現如下錯誤: W: GPG 錯誤:http://ppa.launchpad.net precise Release: 由於沒有公鑰,無法驗證下列簽名: NO_PUBKEY 3EE66BD3F5

【forlong401的專欄--有問題上:http://www.androidren.com】Android and iOS Now! 多交流技術,多分享,技術只有分享,才會經久不衰。 歡迎關注浪微博:@forlong401 。http://weibo.

Android and iOS Now! 多交流技術,多分享,技術只有分享,才會經久不衰。 歡迎關注新浪微博:@forlong401 。http://weibo.com/forlong401...

安裝的Ubuntu在使用sudo apt-get update更新原始碼的時候出現如下錯誤: W: GPG 錯誤:http://ppa.launchpad.net precise Release:

新安裝的Ubuntu在使用sudo apt-get update更新原始碼的時候出現如下錯誤: W: GPG 錯誤:http://ppa.launchpad.net precise Release: 由於沒有公鑰,無法驗證下列簽名: NO_PUBKEY 3EE66BD3F599ACE3 W: G

new blog: www.burningcodes.net

下面是按呼叫約定__stdcall 呼叫函式test(int p1,int p2)的彙編程式碼;假設執行函式前堆疊指標ESP為NNpush   p2    ;引數2入棧, ESP -= 4h , ESP = NN - 4h push   p1    ;引數1入棧, ESP -= 4h , ESP = NN -

the_fire的技術部落格(此部落格為存檔,文章在http://www.the5fire.com)

backbone.js入門教程 backbone.js是一個基於jquery和underscore.js庫的一個web端的MVC框架,使用它可以幫你更好的組織web端的js程式碼以及更靈活的操作dom以及繫結事件。關於它的中文資料

【DianaCody's Blog】部落格部分文章已移至個人站點http://www.dianacody.com,關注Recommend System, Search Engine, Machine Learning, NLP。歡迎訪問。

Personal Website: DianaCody's Shell My Github: DianaCody's Github ************************** My Focus: 52nlp.cn CoolShell.cn in