欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

在傳統(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é)果。但在多線(xiàn)程的異步開(kāi)發(fā)模式下,數(shù)據(jù)的傳遞和返回和同步開(kāi)發(fā)模式有很大的區(qū)別。由于線(xiàn)程的運(yùn)行和結(jié)束是不可預(yù)料的,因此,在傳遞和返回?cái)?shù)據(jù)時(shí)就無(wú)法象函數(shù)一樣通過(guò)函數(shù)參數(shù)和return語(yǔ)句來(lái)返回?cái)?shù)據(jù)。本文就以上原因介紹了幾種用于向線(xiàn)程傳遞數(shù)據(jù)的方法,在下一篇文章中將介紹從線(xiàn)程中返回?cái)?shù)據(jù)的方法。

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

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

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

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

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

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

復(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方法被稱(chēng)為回調(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è)事件。

相關(guān)文章

  • java實(shí)現(xiàn)頁(yè)面多查詢(xún)條件必選的統(tǒng)一處理思路

    java實(shí)現(xiàn)頁(yè)面多查詢(xún)條件必選的統(tǒng)一處理思路

    這篇文章主要為大家介紹了java實(shí)現(xiàn)頁(yè)面多查詢(xún)條件必選的統(tǒng)一處理思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Java中PrintWriter使用方法介紹

    Java中PrintWriter使用方法介紹

    這篇文章主要介紹了Java中PrintWriter使用方法介紹,文章圍繞主題展開(kāi)PrintWriter使用方法的詳細(xì)介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • springboot如何將http轉(zhuǎn)https

    springboot如何將http轉(zhuǎn)https

    這篇文章主要介紹了springboot如何將http轉(zhuǎn)https,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Spring高級(jí)接口Aware淺析

    Spring高級(jí)接口Aware淺析

    通過(guò)aware接口可以獲取Spring容器相關(guān)信息,但這樣會(huì)與Spring容器耦合,這篇文章主要介紹了Spring aware接口理解,需要的朋友可以參考下
    2023-01-01
  • IDEA2021常用優(yōu)化設(shè)置步驟圖解

    IDEA2021常用優(yōu)化設(shè)置步驟圖解

    本文分步驟給大家講解IDEA2021常用優(yōu)化設(shè)置技巧,非常不錯(cuò),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-09-09
  • Java中方法優(yōu)先調(diào)用可選參數(shù)還是固定參數(shù)

    Java中方法優(yōu)先調(diào)用可選參數(shù)還是固定參數(shù)

    這篇文章主要介紹了Java中方法優(yōu)先調(diào)用可選參數(shù)還是固定參數(shù),可選參數(shù)是?JDK?5?中新增的特性,也叫變長(zhǎng)參數(shù)或可變參數(shù),固定參數(shù)的概念恰好與可選參數(shù)相反,固定參數(shù)也就是普通的參,下文更多詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • Springboot基于maven打包分離lib及resource

    Springboot基于maven打包分離lib及resource

    這篇文章主要介紹了Springboot基于maven打包分離lib及resource,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 如何修改HttpServletRequest中header中的信息

    如何修改HttpServletRequest中header中的信息

    這篇文章主要介紹了如何修改HttpServletRequest中header中的信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java實(shí)現(xiàn)簡(jiǎn)單驗(yàn)證碼生成

    java實(shí)現(xiàn)簡(jiǎn)單驗(yàn)證碼生成

    這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單驗(yàn)證碼生成,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 如何優(yōu)雅的處理Spring Boot異常信息詳解

    如何優(yōu)雅的處理Spring Boot異常信息詳解

    這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅的處理Spring Boot異常信息的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論