程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java多線程編程之向線程傳遞數據的三種辦法

java多線程編程之向線程傳遞數據的三種辦法

編輯:關於JAVA

java多線程編程之向線程傳遞數據的三種辦法。本站提示廣大學習愛好者:(java多線程編程之向線程傳遞數據的三種辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是java多線程編程之向線程傳遞數據的三種辦法正文


在傳統的同步開辟形式下,當我們挪用一個函數時,經由過程這個函數的參數將數據傳入,並經由過程這個函數的前往值來前往終究的盤算成果。但在多線程的異步開辟形式下,數據的傳遞和前往和同步開辟形式有很年夜的差別。因為線程的運轉和停止是弗成預感的,是以,在傳遞和前往數據時就沒法象函數一樣經由過程函數參數和return語句來前往數據。本文就以上緣由引見了幾種用於向線程傳遞數據的辦法,鄙人一篇文章中將引見從線程中前往數據的辦法。

欲先取之,必先予之。普通在應用線程時都須要有一些初始化數據,然後線程應用這些數據停止加工處置,並前往成果。在這個進程中最早要做的就是向線程中傳遞數據。

1、經由過程結構辦法傳遞數據
在創立線程時,必需要樹立一個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();       
    }
}

因為這類辦法是在創立線程對象的同時傳遞數據的,是以,在線程運轉之前這些數據就就曾經到位了,如許就不會形成數據在線程運轉後才傳入的景象。假如要傳遞更龐雜的數據,可使用聚集、類等數據構造。應用結構辦法來傳遞數據固然比擬平安,但假如要傳遞的數據比擬多時,就會形成許多未便。因為Java沒有默許參數,要想完成相似默許參數的後果,就得應用重載,如許不只使結構辦法自己過於龐雜,又會使結構辦法在數目上年夜增。是以,要想防止這類情形,就得經由過程類辦法或類變量來傳遞數據。

2、經由過程變量和辦法傳遞數據

向對象中傳入數據普通有兩次機遇,第一次機遇是在樹立對象時經由過程結構辦法將數據傳入,別的一次機遇就是在類中界說一系列的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();
    }
}

3、經由過程回調函數傳遞數據

下面評論辯論的兩種向線程中傳遞數據的辦法是最經常使用的。但這兩種辦法都是main辦法中自動將數據傳入線程類的。這關於線程來講,是主動吸收這些數據的。但是,在有些運用中須要在線程運轉的進程中靜態地獲得數據,如鄙人面代碼的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的法式之間停止數據交互。是以,挪用回調函數的進程就是最原始的激發事宜的進程。在這個例子中挪用了process辦法來取得數據也就相當於在run辦法中激發了一個事宜。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved