当前位置:首页 » 编程语言 » 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

热点内容
游程编码c语言 发布:2025-05-16 21:26:51 浏览:586
帝来哪个配置值得购买 发布:2025-05-16 21:12:29 浏览:462
什么是nodejs前端服务器 发布:2025-05-16 21:12:17 浏览:405
编译选项立即绑定未定义符号 发布:2025-05-16 20:55:13 浏览:906
linuxmysql慢日志 发布:2025-05-16 20:47:58 浏览:271
村两委有哪些配置 发布:2025-05-16 20:34:47 浏览:293
我的世界有什么服务器好玩的 发布:2025-05-16 20:28:57 浏览:484
c语言按位与运算 发布:2025-05-16 20:24:10 浏览:755
苹果手机如何修改密码安全 发布:2025-05-16 20:23:34 浏览:194
图片文字识别算法 发布:2025-05-16 20:21:54 浏览:47