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

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

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

    隨筆 - 312, 文章 - 14, 評(píng)論 - 1393, 引用 - 0
    數(shù)據(jù)加載中……

    Java多線程初學(xué)者指南(7):向線程傳遞數(shù)據(jù)的三種方法

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

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

    在傳統(tǒng)的同步開(kāi)發(fā)模式下,當(dāng)我們調(diào)用一個(gè)函數(shù)時(shí),通過(guò)這個(gè)函數(shù)的參數(shù)將數(shù)據(jù)傳入,并通過(guò)這個(gè)函數(shù)的返回值來(lái)返回最終的計(jì)算結(jié)果。但在多線程的異步開(kāi)發(fā)模式下,數(shù)據(jù)的傳遞和返回和同步開(kāi)發(fā)模式有很大的區(qū)別。由于線程的運(yùn)行和結(jié)束是不可預(yù)料的,因此,在傳遞和返回?cái)?shù)據(jù)時(shí)就無(wú)法象函數(shù)一樣通過(guò)函數(shù)參數(shù)和return語(yǔ)句來(lái)返回?cái)?shù)據(jù)。本文就以上原因介紹了幾種用于向線程傳遞數(shù)據(jù)的方法,在下一篇文章中將介紹從線程中返回?cái)?shù)據(jù)的方法。

        欲先取之,必先予之。一般在使用線程時(shí)都需要有一些初始化數(shù)據(jù),然后線程利用這些數(shù)據(jù)進(jìn)行加工處理,并返回結(jié)果。在這個(gè)過(guò)程中最先要做的就是向線程中傳遞數(shù)據(jù)。

    一、通過(guò)構(gòu)造方法傳遞數(shù)據(jù)

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

    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)建線程對(duì)象的同時(shí)傳遞數(shù)據(jù)的,因此,在線程運(yùn)行之前這些數(shù)據(jù)就就已經(jīng)到位了,這樣就不會(huì)造成數(shù)據(jù)在線程運(yùn)行后才傳入的現(xiàn)象。如果要傳遞更復(fù)雜的數(shù)據(jù),可以使用集合、類等數(shù)據(jù)結(jié)構(gòu)。使用構(gòu)造方法來(lái)傳遞數(shù)據(jù)雖然比較安全,但如果要傳遞的數(shù)據(jù)比較多時(shí),就會(huì)造成很多不便。由于Java沒(méi)有默認(rèn)參數(shù),要想實(shí)現(xiàn)類似默認(rèn)參數(shù)的效果,就得使用重載,這樣不但使構(gòu)造方法本身過(guò)于復(fù)雜,又會(huì)使構(gòu)造方法在數(shù)量上大增。因此,要想避免這種情況,就得通過(guò)類方法或類變量來(lái)傳遞數(shù)據(jù)。

    二、通過(guò)變量和方法傳遞數(shù)據(jù)

        向?qū)ο笾袀魅霐?shù)據(jù)一般有兩次機(jī)會(huì),第一次機(jī)會(huì)是在建立對(duì)象時(shí)通過(guò)構(gòu)造方法將數(shù)據(jù)傳入,另外一次機(jī)會(huì)就是在類中定義一系列的public的方法或變量(也可稱之為字段)。然后在建立完對(duì)象后,通過(guò)對(duì)象實(shí)例逐個(gè)賦值。下面的代碼是對(duì)MyThread1類的改版,使用了一個(gè)setName方法來(lái)設(shè)置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();
        }
    }

    三、通過(guò)回調(diào)函數(shù)傳遞數(shù)據(jù)

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

    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);   
    // 使用回調(diào)函數(shù)
            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方法被稱為回調(diào)函數(shù)。從本質(zhì)上說(shuō),回調(diào)函數(shù)就是事件函數(shù)。在Windows API中常使用回調(diào)函數(shù)和調(diào)用API的程序之間進(jìn)行數(shù)據(jù)交互。因此,調(diào)用回調(diào)函數(shù)的過(guò)程就是最原始的引發(fā)事件的過(guò)程。在這個(gè)例子中調(diào)用了process方法來(lái)獲得數(shù)據(jù)也就相當(dāng)于在run方法中引發(fā)了一個(gè)事件。

    下一篇:
    Java多線程初學(xué)者指南(8):從線程返回?cái)?shù)據(jù)的兩種方法





    Android開(kāi)發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺(tái)灣)

    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) 評(píng)論(2)  編輯  收藏 所屬分類: java 原創(chuàng)多線程

    評(píng)論

    # re: Java多線程初學(xué)者指南(7):向線程傳遞數(shù)據(jù)的三種方法  回復(fù)  更多評(píng)論   

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

    # re: Java多線程初學(xué)者指南(7):向線程傳遞數(shù)據(jù)的三種方法[未登錄](méi)  回復(fù)  更多評(píng)論   

    錯(cuò)誤太多,不要誤人子弟了
    2016-02-04 11:24 | test
    主站蜘蛛池模板: 一个人免费日韩不卡视频| 永久免费视频v片www| 亚洲国产日韩精品| www国产亚洲精品久久久日本| 亚洲精品成人无码中文毛片不卡| 中文在线观看国语高清免费| 亚洲性线免费观看视频成熟| 亚洲av无码专区在线观看下载 | 免费高清国产视频| avtt天堂网手机版亚洲| 亚洲国产精品一区二区第四页 | 日韩免费a级在线观看| 两个人的视频www免费| 亚洲一区二区三区写真| 亚洲日韩精品无码专区网址| 毛片免费观看的视频在线| 国产啪精品视频网站免费尤物| 亚洲日本va中文字幕久久| 成人啪精品视频免费网站| 在线成人精品国产区免费| 亚洲精品国产第一综合99久久| 亚洲AV无码一区二区三区DV| 国产成人啪精品视频免费网| h视频在线观看免费网站| 国产精品成人69XXX免费视频| 中文字幕亚洲一区| 欧洲精品成人免费视频在线观看 | 亚洲日本一线产区和二线 | 日本高清免费网站| 国产电影午夜成年免费视频 | 国产精品久久久久久久久久免费 | 一本色道久久综合亚洲精品蜜桃冫| 亚洲午夜福利717| 四虎永久免费地址在线网站| 免费大片黄在线观看yw| 一级毛片不卡片免费观看| 中文在线观看免费网站| 一级免费黄色毛片| 亚洲午夜久久影院| 亚洲人成色777777在线观看| 亚洲AV网站在线观看|