java線程返回值
㈠ 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