最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java多線程編程之向線程傳遞數(shù)據(jù)的三種方法

 更新時間:2014年01月23日 14:50:26   作者:  
在多線程的異步開發(fā)模式下,數(shù)據(jù)的傳遞和返回和同步開發(fā)模式有很大的區(qū)別。由于線程的運行和結(jié)束是不可預(yù)料的,因此,在傳遞和返回數(shù)據(jù)時就無法象函數(shù)一樣通過函數(shù)參數(shù)和return語句來返回數(shù)據(jù)

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

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

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

復(fù)制代碼 代碼如下:

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

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

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

復(fù)制代碼 代碼如下:

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();
    }
}

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

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

復(fù)制代碼 代碼如下:

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

相關(guān)文章

  • 簡單實現(xiàn)Spring的IOC原理詳解

    簡單實現(xiàn)Spring的IOC原理詳解

    這篇文章主要介紹了簡單實現(xiàn)Spring的IOC原理詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • java實現(xiàn)寫入并保存txt文件的代碼詳解

    java實現(xiàn)寫入并保存txt文件的代碼詳解

    在本篇文章里小編給大家整理了關(guān)于java實現(xiàn)寫入并保存txt文件的代碼實例內(nèi)容,需要的朋友們可以參考學(xué)習(xí)下。
    2020-02-02
  • Spring-AOP-ProceedingJoinPoint的使用詳解

    Spring-AOP-ProceedingJoinPoint的使用詳解

    這篇文章主要介紹了Spring-AOP-ProceedingJoinPoint的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • java之Thread不捕獲異常默認處理邏輯

    java之Thread不捕獲異常默認處理邏輯

    這篇文章主要介紹了java之Thread不捕獲異常默認處理邏輯,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringAOP中的動態(tài)代理技術(shù)深入解析

    SpringAOP中的動態(tài)代理技術(shù)深入解析

    這篇文章主要介紹了SpringAOP中的動態(tài)代理技術(shù)深入解析,spring默認使用JDK動態(tài)代理實現(xiàn)AOP,類如果實現(xiàn)了接口,spring就會用JDK動態(tài)代理實現(xiàn)AOP,如果目標類沒有實現(xiàn)接口,spring則使用Cglib動態(tài)代理來實現(xiàn)AOP,需要的朋友可以參考下
    2024-01-01
  • 在springboot中注入FilterRegistrationBean不生效的原因

    在springboot中注入FilterRegistrationBean不生效的原因

    這篇文章主要介紹了在springboot中注入FilterRegistrationBean不生效的原因及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Mybatis-Plus主鍵生成策略的方法

    Mybatis-Plus主鍵生成策略的方法

    本文主要介紹了Mybatis-Plus主鍵生成策略的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java中volatile防止指令重排

    Java中volatile防止指令重排

    volatile可以防止指令重排,在多線程環(huán)境下有時候我們需要使用volatile來防止指令重排,來保證代碼運行后數(shù)據(jù)的準確性,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java解決Feign異步情況丟失上下文問題

    java解決Feign異步情況丟失上下文問題

    在微服務(wù)的開發(fā)中,我們經(jīng)常需要服務(wù)之間的調(diào)用,本文主要介紹了java解決Feign異步情況丟失上下文問題,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • IntelliJ IDEA 的 Spring 項目如何查看 @Value 的配置和值(方法詳解)

    IntelliJ IDEA 的 Spring 項目如何查看 @Value 的配置和值(方法詳解)

    這篇文章主要介紹了IntelliJ IDEA 的 Spring 項目如何查看 @Value 的配置和值,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10

最新評論

临泉县| 梓潼县| 白河县| 金堂县| 积石山| 旌德县| 内乡县| 手游| 道真| 黄山市| 长泰县| 翼城县| 威宁| 前郭尔| 剑河县| 景宁| 通江县| 获嘉县| 桃园市| 永和县| 乐都县| 浏阳市| 邮箱| 射洪县| 多伦县| 彝良县| 蓬安县| 岳池县| 焦作市| 望城县| 墨玉县| 葫芦岛市| 循化| 青河县| 桐庐县| 宜宾市| 梅州市| 阳泉市| 崇义县| 井冈山市| 微山县|