當前位置:首頁 » 編程語言 » java線程返回值

java線程返回值

發布時間: 2022-12-24 02:14:37

java回調以及如何獲取線程的執行結果

軟體模塊之間存在調用的介面,從調用方式來看,有同步調用、回調、非同步調用這三種方式:

  • 同步調用是是一種阻塞式調用,調用方要等待被調用方執行完畢返回後才能獲取調用的執行結果,是一種單向調用。

  • 回調是一種雙向調用,調用方在執行被調用方後,被調用方會調用被調用方的介面;

  • 非同步調用是一種類似消息或者事件的機制,介面在收到某個消息或發生某事件時,會主動通知客戶方,通常使用回調來實現非同步調用。

Java回調的必須要素:
1.僱主類必須有可以被觀察者調用的方法A;
2.觀察者必須持有可以調用A的對象的引用。

在實際工作中,我們通常將方法A以interface或者內部類的形式來實現,然後把包含有A的類的對象引用傳遞到觀察者中。

Java中的線程的返回值是void,並且是一個非同步執行流,所以我們沒有直接的方法來獲取線程執行後的結果,即不能直接知道線程何時結束,以及合適去獲取線程執行任務後的結果。由於回調的存在,我們可以在線程中以回調的方式通知線程的調用者線程的結束時間,並可以將任務的結果通過回調回送到調用者中。

㈡ java 多線程 有返回值怎麼實現

作為一個完全面向對象的語言,Java提供了類 Java.lang.Thread 來方便多線程編程,這個類提供了大量的方法來方便我們控制自己的各個線程,我們以後的討論都將圍繞這個類進行。 Thread 類最重要的方法是 run()

㈢ java 如何創建一個有返回值的線程

可以通過實現Callable介面創建一個有返回值的線程,代碼如下:

importjava.util.concurrent.*;


<Integer>{

privateintcount;

publicMyThread(intcount){
this.count=count;
}

@Override
publicIntegercall()throwsException{
//此處是線程要處理的業務代碼,此處實現的是對count變數加1的操作
count+=1;
Thread.sleep(1000);
returncount;
}

publicstaticvoidmain(String[]args){

//創建線程實例
MyThreadmyThread=newMyThread(1);

//創建一個大小為10的線程池
ExecutorServiceexecutor=Executors.newFixedThreadPool(10);

//將線程提交到線程池執行
Future<Integer>future=executor.submit(myThread);

try{
//調用get方法獲取線程執行結果,在線程執行完成前該方法會一直阻塞
Integerresult=future.get();
System.out.println(result);
}catch(InterruptedExceptione){
e.printStackTrace();
}catch(ExecutionExceptione){
e.printStackTrace();
}


//try{
////這種寫法可以設置線程執行的超時時間,當線程超過指定的時間還未執行完成時會拋出TimeoutException異常
////示例中表示線程超過1000毫秒還沒執行完就會拋出超時異常
//Integerresult=future.get(1000,TimeUnit.MILLISECONDS);
//System.out.println(result);
//}catch(InterruptedExceptione){
//e.printStackTrace();
//}catch(ExecutionExceptione){
//e.printStackTrace();
//}catch(TimeoutExceptione){
//e.printStackTrace();
//}
}
}

㈣ JAVA多線程問題,想讓每次線程運行後都能返回值給成員變數,要如何修改

把a定義成公共的,在thread里i++時,a也跟著++就行,,不過你的代碼怎麼構造出了好幾個線程???如果這幾個線程公用一個i變數,那麼Thread1需要實現Runnable介面,而不是繼承Thread類
publicclassXianChengNew{
publicstaticinta=0;

publicstaticvoidmain(String[]args){
Thread1t1=null;
t1=newThread1(a);
t1.start();
booleanflag=true;
while(flag){
if(!t1.isAlive()){
flag=false;
}
}
System.out.println("Maina="+a);
}
}

classThread1extendsThread{
privateinti=0;

publicThread1(inti){
super();
this.i=i;
}

@Override
publicvoidrun(){
//super.run();
//for(ints=0;s<100;s++){
add();
//}
}

synchronizedvoidadd(){
for(intc=0;c<5;c++){
i++;
XianChengNew.a++;
System.out.println("i="+i);
System.out.println("a="+XianChengNew.a);
}
}
}

㈤ java 線程中的值如何返回

如果是java5的話,那麼Java5新增了Callable介面獲得線程的返回值,用法如下

packagecom.ronniewang;


importjava.util.concurrent.Callable;
importjava.util.concurrent.ExecutionException;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
importjava.util.concurrent.Future;


{


privatestaticfinalintSLEEP_MILLS=3000;


privatestaticfinalintSECOND_MILLS=1000;


privatestaticintsleepSeconds=SLEEP_MILLS/SECOND_MILLS;


=Executors.newCachedThreadPool();


/**
*在創建多線程程序的時候,我們常實現Runnable介面,Runnable沒有返回值,要想獲得返回值,Java5提供了一個新的介面Callable
*/
publicstaticvoidmain(String[]args){


newGetReturnValueFromCallable().testCallable();
}


privatevoidtestCallable(){


/**
*Callable需要實現的是call()方法,而不是run()方法,返回值的類型有Callable的類型參數指定,
*Callable只能由ExecutorService.submit()執行,正常結束後將返回一個future對象
*/
Future<String>future=executorService.submit(newCallable<String>(){


publicStringcall()throwsException{


Thread.sleep(SLEEP_MILLS);
return"Ifromcallable";
}
});


while(true){
/**
*獲得future對象之前可以使用isDone()方法檢測future是否完成,完成後可以調用get()方法獲得future的值,
*如果直接調用get()方法,get()方法將阻塞值線程結束
*/
if(future.isDone()){
try{
System.out.println(future.get());
break;
}catch(InterruptedExceptione){
//ignored
}catch(ExecutionExceptione){
//ignored
}
}
else{
try{
System.out.println("after"+sleepSeconds--+"seconds,wewillgetfuture");
Thread.sleep(SECOND_MILLS);
}catch(InterruptedExceptione){
//ignored
}
}
}
}
}
packagecom.ronniewang;


importjava.util.concurrent.Callable;
importjava.util.concurrent.ExecutionException;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
importjava.util.concurrent.Future;


{


privatestaticfinalintSLEEP_MILLS=3000;


privatestaticfinalintSECOND_MILLS=1000;


privatestaticintsleepSeconds=SLEEP_MILLS/SECOND_MILLS;


=Executors.newCachedThreadPool();


/**
*在創建多線程程序的時候,我們常實現Runnable介面,Runnable沒有返回值,要想獲得返回值,Java5提供了一個新的介面Callable
*/
publicstaticvoidmain(String[]args){


newGetReturnValueFromCallable().testCallable();
}


privatevoidtestCallable(){


/**
*Callable需要實現的是call()方法,而不是run()方法,返回值的類型有Callable的類型參數指定,
*Callable只能由ExecutorService.submit()執行,正常結束後將返回一個future對象
*/
Future<String>future=executorService.submit(newCallable<String>(){


publicStringcall()throwsException{


Thread.sleep(SLEEP_MILLS);
return"Ifromcallable";
}
});


while(true){
/**
*獲得future對象之前可以使用isDone()方法檢測future是否完成,完成後可以調用get()方法獲得future的值,
*如果直接調用get()方法,get()方法將阻塞值線程結束
*/
if(future.isDone()){
try{
System.out.println(future.get());
break;
}catch(InterruptedExceptione){
//ignored
}catch(ExecutionExceptione){
//ignored
}
}
else{
try{
System.out.println("after"+sleepSeconds--+"seconds,wewillgetfuture");
Thread.sleep(SECOND_MILLS);
}catch(InterruptedExceptione){
//ignored
}
}
}
}
}

輸出結果:
after3seconds,wewillgetfuture
after2seconds,wewillgetfuture
after1seconds,wewillgetfuture
Ifromcallable

㈥ 如何在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

熱點內容
sql提示存儲過程 發布:2025-05-17 07:35:58 瀏覽:743
qq里的互動訪問 發布:2025-05-17 07:26:53 瀏覽:665
口語易賬號密碼發送到哪裡 發布:2025-05-17 07:26:52 瀏覽:62
核桃編程幼兒 發布:2025-05-17 07:26:50 瀏覽:786
2台伺服器集群搭建 發布:2025-05-17 07:18:57 瀏覽:185
北方園林配置植物有哪些 發布:2025-05-17 07:18:20 瀏覽:544
數控加工零件圖及編程 發布:2025-05-17 07:18:11 瀏覽:730
煉鋼鹼度演算法 發布:2025-05-17 07:17:26 瀏覽:14
python獲取年月日 發布:2025-05-17 07:15:33 瀏覽:303
手機加密軟體java 發布:2025-05-17 07:00:24 瀏覽:443