<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
    數據加載中……

    Java多線程初學者指南(8):從線程返回數據的兩種方法

    本文為原創,如需轉載,請注明作者和出處,謝謝!

    上一篇:Java多線程初學者指南(7):向線程傳遞數據的三種方法

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

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

    使用這種方法返回數據需要在調用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方法中已經對value1value2賦了值,而返回的卻是null。發生這種情況的原因是調用start方法后就立刻輸出了value1和value2的值,而這里run方法還沒有執行到為value1和value2賦值的語句。要避免這種情況的發生,就需要等run方法執行完后才執行輸出value1和value2的代碼。因此,我們可以想到使用sleep方法將主線程進行延遲,如可以在thread.start()后加一行如下的語句:

    sleep(1000);

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

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

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

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

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

     

    while循環中第判斷一次value1value2的值后休眠100毫秒,然后再判斷這兩個值。這樣所占用的系統資源會小一些。

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


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

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

    二、通過回調函數返回數據

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

    下一篇:
    Java多線程初學者指南(9):為什么要進行數據同步





    Android開發完全講義(第2版)(本書版權已輸出到臺灣)

    http://product.dangdang.com/product.aspx?product_id=22741502



    Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


    新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

    posted on 2009-03-19 13:02 銀河使者 閱讀(6906) 評論(0)  編輯  收藏 所屬分類: java 原創多線程

    主站蜘蛛池模板: 久久久亚洲AV波多野结衣| 亚洲日韩区在线电影| 亚洲AV无码AV男人的天堂不卡| 91人成网站色www免费下载| 久久久久亚洲AV无码永不| 久久久久久免费一区二区三区| 国产A在亚洲线播放| 久久综合给合久久国产免费| 亚洲av之男人的天堂网站| 久久免费视频网站| 亚洲欧洲一区二区| 免费毛片a在线观看67194| 亚洲偷自精品三十六区| 国产黄色片在线免费观看| 国产av无码专区亚洲av毛片搜| 亚洲欧洲久久av| 国产精品视频白浆免费视频| 久久水蜜桃亚洲av无码精品麻豆| 97公开免费视频| 亚洲精品无码专区在线播放| 免费国产美女爽到喷出水来视频| 好湿好大好紧好爽免费视频| 亚洲AV天天做在线观看| 99无码人妻一区二区三区免费| 亚洲av无码一区二区三区四区| 亚洲一级片免费看| 99精品一区二区免费视频| 亚洲熟女乱色一区二区三区 | 久久国产亚洲精品麻豆| 91精品国产免费久久国语蜜臀 | 免费无码一区二区三区蜜桃| 亚洲成年人在线观看| 永久免费av无码不卡在线观看| 国产亚洲精品第一综合| 亚洲av无码国产精品夜色午夜| 最近最新中文字幕完整版免费高清 | 国产白丝无码免费视频| 亚洲夂夂婷婷色拍WW47| 国产午夜亚洲精品国产成人小说| 中文字幕免费高清视频| 苍井空亚洲精品AA片在线播放|