首頁 考試吧論壇 Exam8視線 考試商城 網(wǎng)絡(luò)課程 模擬考試 考友錄 實用文檔 求職招聘 論文下載
2012中考 | 2012高考 | 2012考研 | 考研培訓(xùn) | 在職研 | 自學(xué)考試 | 成人高考 | 法律碩士 | MBA考試
MPA考試 | 中科院
四六級 | 職稱英語 | 商務(wù)英語 | 公共英語 | 托福 | 托業(yè) | 雅思 | 專四專八 | 口譯筆譯 | 博思
GRE GMAT | 新概念英語 | 成人英語三級 | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學(xué)習(xí) |
零起點法語 | 零起點德語 | 零起點韓語
計算機(jī)等級考試 | 軟件水平考試 | 職稱計算機(jī) | 微軟認(rèn)證 | 思科認(rèn)證 | Oracle認(rèn)證 | Linux認(rèn)證
華為認(rèn)證 | Java認(rèn)證
公務(wù)員 | 報關(guān)員 | 銀行從業(yè)資格 | 證券從業(yè)資格 | 期貨從業(yè)資格 | 司法考試 | 法律顧問 | 導(dǎo)游資格
報檢員 | 教師資格 | 社會工作者 | 外銷員 | 國際商務(wù)師 | 跟單員 | 單證員 | 物流師 | 價格鑒證師
人力資源 | 管理咨詢師 | 秘書資格 | 心理咨詢師 | 出版專業(yè)資格 | 廣告師職業(yè)水平 | 駕駛員
網(wǎng)絡(luò)編輯 | 公共營養(yǎng)師 | 國際貨運代理人 | 保險從業(yè)資格 | 電子商務(wù)師 | 普通話 | 企業(yè)培訓(xùn)師
營銷師
衛(wèi)生資格 | 執(zhí)業(yè)醫(yī)師 | 執(zhí)業(yè)藥師 | 執(zhí)業(yè)護(hù)士
會計從業(yè)資格考試會計證) | 經(jīng)濟(jì)師 | 會計職稱 | 注冊會計師 | 審計師 | 注冊稅務(wù)師
注冊資產(chǎn)評估師 | 高級會計師 | ACCA | 統(tǒng)計師 | 精算師 | 理財規(guī)劃師 | 國際內(nèi)審師
一級建造師 | 二級建造師 | 造價工程師 | 造價員 | 咨詢工程師 | 監(jiān)理工程師 | 安全工程師
質(zhì)量工程師 | 物業(yè)管理師 | 招標(biāo)師 | 結(jié)構(gòu)工程師 | 建筑師 | 房地產(chǎn)估價師 | 土地估價師 | 巖土師
設(shè)備監(jiān)理師 | 房地產(chǎn)經(jīng)紀(jì)人 | 投資項目管理師 | 土地登記代理人 | 環(huán)境影響評價師 | 環(huán)保工程師
城市規(guī)劃師 | 公路監(jiān)理師 | 公路造價師 | 安全評價師 | 電氣工程師 | 注冊測繪師 | 注冊計量師
化工工程師 | 材料員
繽紛校園 | 實用文檔 | 英語學(xué)習(xí) | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲
計算機(jī)等級考試

2012年計算機(jī)二級Java多線程入門技巧(四)

  從線程返回數(shù)據(jù)的兩種方法

  從線程中返回數(shù)據(jù)和向線程傳遞數(shù)據(jù)類似。也可以通過類成員以及回調(diào)函數(shù)來返回數(shù)據(jù)。但類成員在返回數(shù)據(jù)和傳遞數(shù)據(jù)時有一些區(qū)別,下面讓我們來看看它們區(qū)別在哪。

  一、通過類變量和方法返回數(shù)據(jù)

  使用這種方法返回數(shù)據(jù)需要在調(diào)用start方法后才能通過類變量或方法得到數(shù)據(jù)。讓我們先來看看例程2-13會得到什么結(jié)果。

  package mythread;

  2.

  3.public class MyThread extends Thread

  4.{

  5. private String value1;

  6. private String value2;

  7.

  8. public void run()

  9. {

  10. value1 = "通過成員變量返回數(shù)據(jù)";

  11. value2 = "通過成員方法返回數(shù)據(jù)";

  12. }

  13. public static void main(String[] args) throws Exception

  14. {

  15. MyThread thread = new MyThread();

  16. thread.start();

  17. System.out.println("value1:" + thread.value1);

  18. System.out.println("value2:" + thread.value2);

  19. }

  20.}

  運行上面的代碼有可能輸出如下的結(jié)果

  value1:null

  value2:null

  從上面的運行結(jié)果看很不正常。在run方法中已經(jīng)對value1和value2賦了值,而返回的卻是null.發(fā)生這種情況的原因是調(diào)用start方法后就立刻輸出了value1和value2的值,而這里run方法還沒有執(zhí)行到為value1和value2賦值的語句。要避免這種情況的發(fā)生,就需要等run方法執(zhí)行完后才執(zhí)行輸出value1和value2的代碼。因此,我們可以想到使用sleep方法將主線程進(jìn)行延遲,如可以在thread.start()后加一行如下的語句

  sleep(1000);

  這樣做可以使主線程延遲1秒后再往下執(zhí)行,但這樣做有一個問題,就是我們怎么知道要延遲多長時間。在這個例子的run方法中只有兩條賦值語句,而且只創(chuàng)建了一個線程,因此,延遲1秒已經(jīng)足夠,但如果run方法中的語句很復(fù)雜,這個時間就很難預(yù)測,因此,這種方法并不穩(wěn)定。

  我們的目的就是得到value1和value2的值,因此,只要判斷value1和value2是否為null.如果它們都不為null時,就可以輸出這兩個值了。我們可以使用如下的代碼來達(dá)到這個目的。

  21.while (thread.value1 == null || thread.value2 == null);

  使用上面的語句可以很穩(wěn)定地避免這種情況發(fā)生,但這種方法太耗費系統(tǒng)資源。大家可以設(shè)想,如果run方法中的代碼很復(fù)雜,value1和value2需要很長時間才能被賦值,這樣while循環(huán)就必須一直執(zhí)行下去,直到value1和value2都不為空為止。因此,我們可以對上面的語句做如下的改進(jìn)。

  22.while (thread.value1 == null || thread.value2 == null)

  23. sleep(100);

  在while循環(huán)中第判斷一次value1和value2的值后休眠100毫秒,然后再判斷這兩個值。這樣所占用的系統(tǒng)資源會小一些。

  上面的方法雖然可以很好地解決,但Java的線程模型為我們提供了更好的解決方案,這就是join方法。在前面已經(jīng)討論過,join的功能就是使用線程從異步執(zhí)行變成同步執(zhí)行。當(dāng)線程變成同步執(zhí)行后,就和從普通的方法中得到返回數(shù)據(jù)沒有什么區(qū)別了。因此,可以使用如下的代碼更有效地解決這個問題:

  thread.start();

  thread.join();

  在thread.join()執(zhí)行完后,線程thread的run方法已經(jīng)退出了,也就是說線程thread已經(jīng)結(jié)束了。因此,在thread.join()后面可以放心大膽地使用MyThread類的任何資源來得到返回數(shù)據(jù)。

  二、通過回調(diào)函數(shù)返回數(shù)據(jù)

  其實這種方法已經(jīng)在《向線程傳遞數(shù)據(jù)的三種方法》中介紹了。在《向線程傳遞數(shù)據(jù)的三種方法》一文的例子中通過Work類的process方法向線程中傳遞了計算結(jié)果,但也通過process方法從線程中得到了三個隨機(jī)數(shù)。因此,這種方法既可以向線程中傳遞數(shù)據(jù),也可以從線程中獲得數(shù)據(jù)。

  相關(guān)推薦:

  2012年下半年計算機(jī)等級考試報名時間及入口匯總

  計算機(jī)等級考試三級PC技術(shù)過關(guān)心得技巧

  2012年3月計算機(jī)二級考試真題匯總

文章搜索
計算機(jī)等級考試欄目導(dǎo)航
版權(quán)聲明:如果計算機(jī)等級考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系800@exam8.com,我們將會及時處理。如轉(zhuǎn)載本計算機(jī)等級考試網(wǎng)內(nèi)容,請注明出處。