在我们对线程进行操作时,调用新线程去执行任务,在一般的情况下不会获得它的输出结果。这对于得到有关线程的反馈比较困难,但也不是没有办法解决的。本篇要带来的是Future,下面我们就它的概念、接口进行介绍,然后再实例中探寻获取线程结果的使用,大家一起来看具体内容。
1、概念
Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便在任务执行成功或失败后作出相应的操作。
2、Future接口
Future接口定义了主要的5个接口方法,有RunnableFuture和SchedualFuture继承这个接口,以及CompleteFuture和ForkJoinTask继承这个接口。
3、实例
package test;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableFutureTest {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
Callable calculateCallable = new Callable() {
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
Thread.sleep(2000);//模拟耗时时间
int result = 1+2;
return result;
}
};
FutureTask calculateFutureTask = new FutureTask<>(calculateCallable);
Thread t1 = new Thread(calculateFutureTask);
t1.start();
//现在加入Thread运行的是一个模拟远程调用耗时的服务,并且依赖他的计算结果(比如网络计算器)
try {
//模拟耗时任务,主线程做自己的事情,体现多线程的优势
Thread.sleep(3000);
int a = 3+5;
Integer result = calculateFutureTask.get();
System.out.println("result = "+(a+result));//模拟主线程依赖子线程的运行结果
long endTime = System.currentTimeMillis();
System.out.println("time = "+(endTime-startTime)+"ms");
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} 从上面可以看到上面耗时大概是3s,其实主要就是主线程sleep(3000)所耗费的时间,如果不使用Future,并且依赖线程的结果,我们可能需要的时间可能是需要5s(子线程2s+主线程3s)。
以上就是Future在java中获取线程结果的方法,可以说Future在处理线程上比较灵活,机制大致为进行一个线程时,另一个线程同时运行。大家感兴趣的话,可以在课后深入了解。更多Java学习指路:java教程



