java多線程編程之從線程返回?cái)?shù)據(jù)的兩種方法
一、通過(guò)類(lèi)變量和方法返回?cái)?shù)據(jù)
使用這種方法返回?cái)?shù)據(jù)需要在調(diào)用start方法后才能通過(guò)類(lèi)變量或方法得到數(shù)據(jù)。讓我們先來(lái)看看例程2-13會(huì)得到什么結(jié)果。
package mythread;
public class MyThread extends Thread
{
private String value1;
private String value2;
public void run()
{
value1 = "通過(guò)成員變量返回?cái)?shù)據(jù)";
value2 = "通過(guò)成員方法返回?cái)?shù)據(jù)";
}
public static void main(String[] args) throws Exception
{
MyThread thread = new MyThread();
thread.start();
System.out.println("value1:" + thread.value1);
System.out.println("value2:" + thread.value2);
}
}
運(yùn)行上面的代碼有可能輸出如下的結(jié)果:
value1:null
value2:null
從上面的運(yùn)行結(jié)果看很不正常。在run方法中已經(jīng)對(duì)value1和value2賦了值,而返回的卻是null。發(fā)生這種情況的原因是調(diào)用start方法后就立刻輸出了value1和value2的值,而這里run方法還沒(méi)有執(zhí)行到為value1和value2賦值的語(yǔ)句。要避免這種情況的發(fā)生,就需要等run方法執(zhí)行完后才執(zhí)行輸出value1和value2的代碼。因此,我們可以想到使用sleep方法將主線程進(jìn)行延遲,如可以在thread.start()后加一行如下的語(yǔ)句:
sleep(1000);
這樣做可以使主線程延遲1秒后再往下執(zhí)行,但這樣做有一個(gè)問(wèn)題,就是我們?cè)趺粗酪舆t多長(zhǎng)時(shí)間。在這個(gè)例子的run方法中只有兩條賦值語(yǔ)句,而且只創(chuàng)建了一個(gè)線程,因此,延遲1秒已經(jīng)足夠,但如果run方法中的語(yǔ)句很復(fù)雜,這個(gè)時(shí)間就很難預(yù)測(cè),因此,這種方法并不穩(wěn)定。
我們的目的就是得到value1和value2的值,因此,只要判斷value1和value2是否為null。如果它們都不為null時(shí),就可以輸出這兩個(gè)值了。我們可以使用如下的代碼來(lái)達(dá)到這個(gè)目的:
while (thread.value1 == null || thread.value2 == null);
使用上面的語(yǔ)句可以很穩(wěn)定地避免這種情況發(fā)生,但這種方法太耗費(fèi)系統(tǒng)資源。大家可以設(shè)想,如果run方法中的代碼很復(fù)雜,value1和value2需要很長(zhǎng)時(shí)間才能被賦值,這樣while循環(huán)就必須一直執(zhí)行下去,直到value1和value2都不為空為止。因此,我們可以對(duì)上面的語(yǔ)句做如下的改進(jìn):
while (thread.value1 == null || thread.value2 == null)
sleep(100);
在while循環(huán)中第判斷一次value1和value2的值后休眠100毫秒,然后再判斷這兩個(gè)值。這樣所占用的系統(tǒng)資源會(huì)小一些。
上面的方法雖然可以很好地解決,但Java的線程模型為我們提供了更好的解決方案,這就是join方法。在前面已經(jīng)討論過(guò),join的功能就是使用線程從異步執(zhí)行變成同步執(zhí)行。當(dāng)線程變成同步執(zhí)行后,就和從普通的方法中得到返回?cái)?shù)據(jù)沒(méi)有什么區(qū)別了。因此,可以使用如下的代碼更有效地解決這個(gè)問(wèn)題:
thread.start();
thread.join();
在thread.join()執(zhí)行完后,線程thread的run方法已經(jīng)退出了,也就是說(shuō)線程thread已經(jīng)結(jié)束了。因此,在thread.join()后面可以放心大膽地使用MyThread類(lèi)的任何資源來(lái)得到返回?cái)?shù)據(jù)。
二、通過(guò)回調(diào)函數(shù)返回?cái)?shù)據(jù)
其實(shí)這種方法已經(jīng)在《向線程傳遞數(shù)據(jù)的三種方法》中介紹了。在《向線程傳遞數(shù)據(jù)的三種方法》一文的例子中通過(guò)Work類(lèi)的process方法向線程中傳遞了計(jì)算結(jié)果,但同時(shí),也通過(guò)process方法從線程中得到了三個(gè)隨機(jī)數(shù)。因此,這種方法既可以向線程中傳遞數(shù)據(jù),也可以從線程中獲得數(shù)據(jù)。
- java多線程處理執(zhí)行solr創(chuàng)建索引示例
- 命令行使用支持?jǐn)帱c(diǎn)續(xù)傳的java多線程下載器
- java多線程編程之捕獲子線程異常示例
- java多線程編程之使用Synchronized塊同步變量
- java多線程編程之使用Synchronized塊同步方法
- java多線程編程之使用Synchronized關(guān)鍵字同步類(lèi)方法
- java多線程編程之為什么要進(jìn)行數(shù)據(jù)同步
- java多線程編程之向線程傳遞數(shù)據(jù)的三種方法
- java多線程編程之慎重使用volatile關(guān)鍵字
- java多線程編程之join方法的使用示例
- java多線程編程之線程的生命周期
- java多線程編程之使用runnable接口創(chuàng)建線程
- java多線程編程之使用thread類(lèi)創(chuàng)建線程
- java多線程編程之java線程簡(jiǎn)介
- java多線程并發(fā)中使用Lockers類(lèi)將多線程共享資源鎖定
- java多線程并發(fā)executorservice(任務(wù)調(diào)度)類(lèi)
- java基本教程之join方法詳解 java多線程教程
- java多線程返回值使用示例(callable與futuretask)
相關(guān)文章
EasyExcel實(shí)現(xiàn)讀寫(xiě)Excel文件的示例代碼
EasyExcel是阿里巴巴開(kāi)源的一個(gè)excel處理框架,以使用簡(jiǎn)單、節(jié)省內(nèi)存著稱(chēng)。它可以在盡可能節(jié)約內(nèi)存的情況下支持讀寫(xiě)百M(fèi)的Excel,所以本文就將利用它實(shí)現(xiàn)讀寫(xiě)Excel文件,感興趣的可以了解一下2022-08-08
Spring Validator接口校驗(yàn)與全局異常處理器
這篇文章主要介紹了Spring Validator接口校驗(yàn)與全局異常處理器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
java發(fā)起http請(qǐng)求獲取返回的Json對(duì)象方法
下面小編就為大家分享一篇java發(fā)起http請(qǐng)求獲取返回的Json對(duì)象方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Java多線程之讀寫(xiě)鎖分離設(shè)計(jì)模式
這篇文章主要介紹了Java多線程讀寫(xiě)鎖分離設(shè)計(jì)模式,主要利用Java到嗎完成read read 并行化、read write 不允許、write write 不允許幾項(xiàng)任務(wù),需要的朋友可以參考一下2021-10-10
Java String類(lèi)簡(jiǎn)單用法實(shí)戰(zhàn)示例【字符串輸出、比較】
這篇文章主要介紹了Java String類(lèi)簡(jiǎn)單用法,結(jié)合具體實(shí)例形式分析了Java使用String類(lèi)實(shí)現(xiàn)字符串的輸出和比較功能相關(guān)操作技巧,需要的朋友可以參考下2019-07-07
淺析 ArrayList 和 LinkedList 有什么區(qū)別
ArrayList 和 LinkedList 有什么區(qū)別,是面試官非常喜歡問(wèn)的一個(gè)問(wèn)題。今天通過(guò)本文給大家詳細(xì)介紹下,感興趣的朋友跟隨小編一起看看吧2020-10-10
SpringBoot2.0集成MQTT消息推送功能實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot2.0集成MQTT消息推送功能實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

