導航:首頁 > 編程語言 > java線程非同步傳值

java線程非同步傳值

發布時間:2024-09-05 01:22:35

java向線程傳遞數據的三種方法

在傳統的同步開發模式下 當我們調用一個函數時 通過這個函數的參數將數據傳入 並通過這個函數的返回值來返回最終的計算結果 但在多線程的非同步開發模式下 數據的傳遞和返回和同步開發模式有很大的區別 由於線程的運行和結束是不可預蘆遲料的 因此 在傳遞和返回數據時就無法象函數一樣通過函數參數和return語句來返回數據 本文就以上原因介紹了幾種用於向線程傳遞數據的方法 在下一篇文章中將介紹從線程中返回數據的方法

欲先取之 必先予之 一般在使用線程時都需要有一些初始化數據 然後線程利用這些數據進行加工處理 並返回結果 在這個過程中最先要做的就是向線程中傳遞數據

一 通過構造方法傳遞數據

在創建線程時 必須要建立一個Thread類的或其子類的實例 因此 我們不難想到在調用start方法之前通過線程類的構造方法將數據傳入線程 並將傳入的數據使用類變數保存起來 以便線程使用(其實就是在run方法中使用) 下面的代碼演示了如何通過構造方法來傳遞數據

package mythread;

public class MyThread extends Thread

{

private String name;

public MyThread (String name)

{

this name = name;

}

public void run()

{

System out println( hello + name);

}

public static void main(String[] args)

{

Thread thread = new MyThread ( world );

thread start();

}

}

由於這種方法是在創建線程對象的同時傳遞數據的 因此 在線程運行之前這些數據就就已經到位了 這樣就不會造成數據在線程運行後才傳入的現象 如果要傳遞更復雜的數據 可以使用集合 類等數據結構 使用構造方法來傳遞數據雖然比較安全 但如果要傳遞的數據比較多時 就會造成很多不便 由於Java沒有默認參數 要想實現類似默認參數的效果 就得使用重載 這樣不但使構造方法本身過於復雜 又會使構造方法在數量上大增 因此 要想避免這種情況 就得通過類方法或類變數來傳遞數據

二 通過變數和方法傳遞數據

向對象中傳入數據一般有兩次機會 第一次機會是在建立對象時通過構造方法將數據傳入 另外一次機會就是在類中定義一系列的public的方法或變數(也可稱之譽裂為欄位) 然後在建立完對象後 通過對象實例逐個賦值 下面的代碼是對MyThread 類的改版 使用了一個setName方法來設置name變數

package mythread;

public class MyThread 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)

{

MyThread myThread = new MyThread ();

myThread setName( world );

Thread thread = new Thread(myThread);

thread start();

}

}

三 通過回調函數傳遞數據

上面討論的兩種向慶嘩閉線程中傳遞數據的方法是最常用的 但這兩種方法都是main方法中主動將數據傳入線程類的 這對於線程來說 是被動接收這些數據的 然而 在有些應用中需要在線程運行的過程中動態地獲取數據 如在下面代碼的run方法中產生了 個隨機數 然後通過Work類的process方法求這三個隨機數的和 並通過Data類的value將結果返回 從這個例子可以看出 在返回value之前 必須要得到三個隨機數 也就是說 這個value是無法事先就傳入線程類的

package mythread;

class Data

{

public int value = ;

}

class Work

{

public void process(Data data Integer numbers)

{

for (int n : numbers)

{

data value += n;

}

}

}

public class MyThread extends Thread

{

private Work work;

public MyThread (Work work)

{

this work = work;

}

public void run()

{

java util Random random = new java util Random();

Data data = new Data();

int n = random nextInt( );

int n = random nextInt( );

int n = random nextInt( );

work process(data n n n ); // 使用回調函數

System out println(String valueOf(n ) + + + String valueOf(n ) + +

+ String valueOf(n ) + = + data value);

}

public static void main(String[] args)

{

Thread thread = new MyThread (new Work());

thread start();

}

}

lishixin/Article/program/Java/hx/201311/26623

㈡ java中使用非同步線程池有什麼優缺點

缺點是難以保證數據的准確性 (data integration),還有一個是需要更多的資源。

優點是可以並列處理一些工作,從而減少一些不必要的等待時間(blocking)

非同步線程在 UI 和 網路連接方面很常見的

㈢ 如何在java中獲取線程非同步執行之後的結果

java中提供了Future<V>介面和實現了Future介面的FutureTask<V> 類來將線程執行之後的結果返回(通過get()方法)。
1.Future<V>介面
Runnable介面執行任務是不返回任何值的,Runnable的run()方法的執行結果是void,而Future介面的call方法是有返回結果的,這是Runnable跟Future的區別之一,它們的另一個不同之處就是實現了Runnable介面的任務執行是調用ExecutorService的execute(Runnable task)方法,而實現了Future介面的任務是調用ExecutorService的submit(Future task)方法。調用Future的get()方法就能直接得到任務的返回值,該方法會一直阻塞直到任務的結果出來為止,我們可以調用Future的isDone()方法來判斷該任務的結果是否准備就緒。
[java] view plain
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TestFuture {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newCachedThreadPool();
Future result1 = executor.submit(new Callable() {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += i;
}
return sum;
}
});
Future result2 = executor.submit(new Callable() {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 10; i < 100; i++) {
sum += i;
}
return sum;
}
});
executor.shutdown();
System.out.println(result1.get() + result2.get());
}
}
2.FutureTask類
FutureTask實現了Future介面,將一個Callable實例作為參數傳給它,就能創建一個FutureTask實例,然後用ExecutorService的submit方法來執行這個實例。最後同樣是用get方法獲取線程執行後的結果。
[plain] view plain
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class TestFutureTask {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newCachedThreadPool();
Callable task = new Callable() {
@Override
public String call() throws Exception {
return "結果";
}
};
FutureTask ft = new FutureTask(task);
executor.submit(ft);
System.out.println(ft.get());
executor.shutdown();
}
}empty

㈣ java中怎麼把一個線程裡面的變數傳到另一個線程

把這個變數定義提取到線程外部, 線程通過引用持有這個變數, 這樣就可以實現變數的共享, 這個時候就要注意線程同步的問題.

㈤ java如何實現線程非同步

Thread t=new Thread(){
public void run(){
//保存信息操作
}
}
t.start();
//同時做別的事情.

閱讀全文

與java線程非同步傳值相關的資料

熱點內容
painter2015視頻教程 瀏覽:204
jsperror 瀏覽:183
網路到底怎麼賺錢 瀏覽:402
蘋果耳機插口接觸不良 瀏覽:934
運動手環app哪個好 瀏覽:854
java設置double精度 瀏覽:587
java代碼分享網站 瀏覽:321
ps怎麼復制到文件裡面 瀏覽:360
win7管理員指紋登錄密碼忘了怎麼辦 瀏覽:38
c是一次性插入多少條數據 瀏覽:928
u盤文件編輯軟體 瀏覽:767
vb如何打開pdf文件 瀏覽:351
soundlinkiii升級 瀏覽:64
如何把文件改成cad 瀏覽:676
如何把多個監控合在一個網路內 瀏覽:637
qq的頭像在哪個文件夾 瀏覽:468
linuxexfat補丁 瀏覽:582
excelvb編程怎麼輸出數 瀏覽:737
567位qq 瀏覽:172
qq網名女生傷感 瀏覽:292

友情鏈接