Java并发-异步执行Future
在开发过程中很容易遇到这么一种情况,要执行一个耗时的任务,为了提高效率我们在执行耗时任务的时候同时执行其他暂时不需要耗时任务的代码,直到需要这个耗时任务的返回时才去获取任务结果,那么在Java中Future接口是专门用来异步执行,并在需要的时候获取执行的结果的一个接口。典型的我们有
/**
* jdk 8
* /
public class Main {
public static void main(String[] args) {
ExecutorService exec = new ThreadPoolExecutor(100, 200, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(500));
Future<String> future = exec.submit(Main::doSomethingNeedTime);
//其他的操作
try{
String result = future.get();
}catch (Exception ex){
//log
}
}
private static String doSomethingNeedTime(){
try {
TimeUnit.SECONDS.sleep(1);
}catch (InterruptedException ex){
//log
}
return "over";
}
}
在这里线程池submit方法返回的是一个FutureTask类,接下来我们就从源码入手讲一讲这个FutureTask具体是怎么工作的。
FutureTask
FutureTask实现了FutureRunnable接口,而这个接口又继承了Future接口和Runnable接口。
public class FutureTask<V> implements RunnableFuture<V>
正式因为FutureTask实现的接口FutureRunnable即继承了Future接口又继承了Runnable接口所以ThreadPoolExecutor的submit方法其实是将Callable用FutureTask适配成了Runnable最后调用了execute方法。
Future的主要字段如下
//代表当前FutureTask的状态
private volatile int state;
private static final int NEW = 0;
private static final int COMPLETING = 1;
private static final int NORMAL = 2;
private static final int EXCEPTIONAL = 3;
private static