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辦法中激發了一個事宜。