一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java多線程編程之從線程返回數據的兩種方法

java多線程編程之從線程返回數據的兩種方法

2019-11-04 14:05java教程網 JAVA教程

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

一、通過類變量和方法返回數據

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

 

復制代碼代碼如下:


package mythread;

 

public class MyThread extends Thread
{
    private String value1;
    private String value2;

    public void run()
    {
        value1 = "通過成員變量返回數據";
        value2 = "通過成員方法返回數據";
    }
    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);
    }
}



運行上面的代碼有可能輸出如下的結果:

復制代碼代碼如下:

value1:null
value2:null

 

從上面的運行結果看很不正常。在run方法中已經對value1和value2賦了值,而返回的卻是null。發生這種情況的原因是調用start方法后就立刻輸出了value1和value2的值,而這里run方法還沒有執行到為value1和value2賦值的語句。要避免這種情況的發生,就需要等run方法執行完后才執行輸出value1和value2的代碼。因此,我們可以想到使用sleep方法將主線程進行延遲,如可以在thread.start()后加一行如下的語句:
sleep(1000);
這樣做可以使主線程延遲1秒后再往下執行,但這樣做有一個問題,就是我們怎么知道要延遲多長時間。在這個例子的run方法中只有兩條賦值語句,而且只創建了一個線程,因此,延遲1秒已經足夠,但如果run方法中的語句很復雜,這個時間就很難預測,因此,這種方法并不穩定。
我們的目的就是得到value1和value2的值,因此,只要判斷value1和value2是否為null。如果它們都不為null時,就可以輸出這兩個值了。我們可以使用如下的代碼來達到這個目的:

復制代碼代碼如下:

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

 

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

復制代碼代碼如下:

while (thread.value1 == null || thread.value2 == null)
    sleep(100);

 

在while循環中第判斷一次value1和value2的值后休眠100毫秒,然后再判斷這兩個值。這樣所占用的系統資源會小一些。
上面的方法雖然可以很好地解決,但Java的線程模型為我們提供了更好的解決方案,這就是join方法。在前面已經討論過,join的功能就是使用線程從異步執行變成同步執行。當線程變成同步執行后,就和從普通的方法中得到返回數據沒有什么區別了。因此,可以使用如下的代碼更有效地解決這個問題:

復制代碼代碼如下:

thread.start();
thread.join();

 

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

二、通過回調函數返回數據
其實這種方法已經在《向線程傳遞數據的三種方法》中介紹了。在《向線程傳遞數據的三種方法》一文的例子中通過Work類的process方法向線程中傳遞了計算結果,但同時,也通過process方法從線程中得到了三個隨機數。因此,這種方法既可以向線程中傳遞數據,也可以從線程中獲得數據。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲AV 日韩 国产 有码 | 国内精品一区视频在线播放 | 国产精品亚洲片在线观看麻豆 | 秘书小说阿蛮 | 91精品国产色综合久久不卡蜜 | 操美女 | 久久精品无码一区二区日韩av | 男人肌肌捅女人肌肌 | 免费在线看片网站 | 天天色综合6 | 日本免费一区二区三区四区五六区 | 欧美色图亚洲天堂 | 久草在在线免视频在线观看 | 国产精品久久久久久影院 | 国产精品视频在这里有精品 | 日本成日本片人免费 | 欧美成狂野欧美在线观看 | 秋霞午夜视频 | 日韩在线视频免费观看 | 日韩av线观看 | 女同志freelesvoices| 韩日视频在线 | 美女免费观看一区二区三区 | 我和岳的性事小说 | 久久久久琪琪精品色 | 亚洲国产精品无圣光一区二区 | 四虎影视永久在线 | 免费视频一级片 | 国产激情一区二区三区四区 | 国产小嫩模好紧 | 我要色色网| 日本无卡无吗中文免费 | 91天堂在线视频 | 亚洲国产成人99精品激情在线 | 性欧美xxxxx老太婆 | 成年美女黄网站色视频大全免费 | 被黑人同学彻底征服全文小说阅读 | www.一区二区三区.com | 操碰91| 17岁韩国在线观看免费1 | 国产91素人搭讪系列天堂 |