<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多線程初學者指南(7):向線程傳遞數據的三種方法

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

    上一篇:Java多線程初學者指南(6):慎重使用volatile關鍵字

    在傳統(tǒng)的同步開發(fā)模式下,當我們調用一個函數時,通過這個函數的參數將數據傳入,并通過這個函數的返回值來返回最終的計算結果。但在多線程的異步開發(fā)模式下,數據的傳遞和返回和同步開發(fā)模式有很大的區(qū)別。由于線程的運行和結束是不可預料的,因此,在傳遞和返回數據時就無法象函數一樣通過函數參數和return語句來返回數據。本文就以上原因介紹了幾種用于向線程傳遞數據的方法,在下一篇文章中將介紹從線程中返回數據的方法。

        欲先取之,必先予之。一般在使用線程時都需要有一些初始化數據,然后線程利用這些數據進行加工處理,并返回結果。在這個過程中最先要做的就是向線程中傳遞數據。

    一、通過構造方法傳遞數據

    在創(chuàng)建線程時,必須要建立一個Thread類的或其子類的實例。因此,我們不難想到在調用start方法之前通過線程類的構造方法將數據傳入線程。并將傳入的數據使用類變量保存起來,以便線程使用(其實就是在run方法中使用)。下面的代碼演示了如何通過構造方法來傳遞數據:

    package mythread;

    public class MyThread1 extends Thread
    {
        
    private String name;

        
    public MyThread1(String name)
        {
            
    this.name = name;
        }
        
    public void run()
        {
            System.out.println(
    "hello " + name);
        }
        
    public static void main(String[] args)
        {
            Thread thread 
    = new MyThread1("world");
            thread.start();       
        }
    }

        由于這種方法是在創(chuàng)建線程對象的同時傳遞數據的,因此,在線程運行之前這些數據就就已經到位了,這樣就不會造成數據在線程運行后才傳入的現象。如果要傳遞更復雜的數據,可以使用集合、類等數據結構。使用構造方法來傳遞數據雖然比較安全,但如果要傳遞的數據比較多時,就會造成很多不便。由于Java沒有默認參數,要想實現類似默認參數的效果,就得使用重載,這樣不但使構造方法本身過于復雜,又會使構造方法在數量上大增。因此,要想避免這種情況,就得通過類方法或類變量來傳遞數據。

    二、通過變量和方法傳遞數據

        向對象中傳入數據一般有兩次機會,第一次機會是在建立對象時通過構造方法將數據傳入,另外一次機會就是在類中定義一系列的public的方法或變量(也可稱之為字段)。然后在建立完對象后,通過對象實例逐個賦值。下面的代碼是對MyThread1類的改版,使用了一個setName方法來設置name變量:

    package mythread;

    public class MyThread2 implements Runnable
    {
        
    private String name;

        
    public void setName(String name)
        {
            
    this.name = name;
        }
        
    public void run()
        {
            System.out.println(
    "hello " + name);
        }
        
    public static void main(String[] args)
        {
            MyThread2 myThread 
    = new MyThread2();
            myThread.setName(
    "world");
            Thread thread 
    = new Thread(myThread);
            thread.start();
        }
    }

    三、通過回調函數傳遞數據

        上面討論的兩種向線程中傳遞數據的方法是最常用的。但這兩種方法都是main方法中主動將數據傳入線程類的。這對于線程來說,是被動接收這些數據的。然而,在有些應用中需要在線程運行的過程中動態(tài)地獲取數據,如在下面代碼run方法中產生了3個隨機數,然后通過Work類的process方法求這三個隨機數的和,并通過Data類的value將結果返回。從這個例子可以看出,在返回value之前,必須要得到三個隨機數。也就是說,這個value是無法事先就傳入線程類的。

    package mythread;

    class Data
    {
        
    public int value = 0;
    }
    class Work
    {
        
    public void process(Data data, Integer numbers)
        {
            
    for (int n : numbers)
            {
                data.value 
    += n;
            }
        }
    }
    public class MyThread3 extends Thread
    {
        
    private Work work;

        
    public MyThread3(Work work)
        {
            
    this.work = work;
        }
        
    public void run()
        {
            java.util.Random random 
    = new java.util.Random();
            Data data 
    = new Data();
            
    int n1 = random.nextInt(1000);
            
    int n2 = random.nextInt(2000);
            
    int n3 = random.nextInt(3000);
            work.process(data, n1, n2, n3);   
    // 使用回調函數
            System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+"
                    
    + String.valueOf(n3) + "=" + data.value);
        }
        
    public static void main(String[] args)
        {
            Thread thread 
    = new MyThread3(new Work());
            thread.start();
        }
    }

    在上面代碼中的process方法被稱為回調函數。從本質上說,回調函數就是事件函數。在Windows API中常使用回調函數和調用API的程序之間進行數據交互。因此,調用回調函數的過程就是最原始的引發(fā)事件的過程。在這個例子中調用了process方法來獲得數據也就相當于在run方法中引發(fā)了一個事件。

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





    Android開發(fā)完全講義(第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-16 23:18 銀河使者 閱讀(15842) 評論(2)  編輯  收藏 所屬分類: java 原創(chuàng)多線程

    評論

    # re: Java多線程初學者指南(7):向線程傳遞數據的三種方法  回復  更多評論   

    Pipe
    2009-03-19 12:16 | 隔葉黃鶯

    # re: Java多線程初學者指南(7):向線程傳遞數據的三種方法[未登錄]  回復  更多評論   

    錯誤太多,不要誤人子弟了
    2016-02-04 11:24 | test
    主站蜘蛛池模板: 黄色网址免费大全| 插鸡网站在线播放免费观看| 最近免费中文字幕大全免费| 日本亚洲欧洲免费天堂午夜看片女人员| 国产91成人精品亚洲精品| 国产精品免费电影| 国产亚洲男人的天堂在线观看| 日韩a级毛片免费视频| 麻豆亚洲AV成人无码久久精品| 国产免费私拍一区二区三区| 老子影院午夜伦不卡亚洲| 免费一级成人毛片| 国产黄色免费观看| 国产AV无码专区亚洲AV毛网站| 国产成人无码区免费网站| 亚洲AV第一页国产精品| 亚洲视频在线免费播放| 亚洲综合校园春色| 午夜视频免费成人| 性生大片视频免费观看一级| 中文字幕精品亚洲无线码一区| a在线观看免费网址大全| 亚洲色图.com| 日本高清免费不卡在线| 一区二区免费电影| 久久久久亚洲AV无码永不| 欧洲黑大粗无码免费| 香蕉97碰碰视频免费| 亚洲国产另类久久久精品| 国产乱子精品免费视观看片| 亚洲精品美女久久7777777| 亚洲日本韩国在线| 99久久免费精品视频| 亚洲最大的成人网| 亚洲毛片不卡av在线播放一区| 13小箩利洗澡无码视频网站免费| 亚洲狠狠ady亚洲精品大秀| 免费观看国产小粉嫩喷水| 久久久久久久99精品免费观看| 亚洲www在线观看| 亚洲色偷偷综合亚洲AV伊人|