广义的Future模式如下:
Future模式的主要参与者:
Future模式的核心结构如下:
Future模式的简单实现
核心接口Data,是用户需要获取的实现,它有2个实现:RealData,FutureData;
- RealData:真实返回的数据;
- FutureData:实现了一个快速返回的RealData的包装;可以很快被构造并返回;当使用FutureData的getResult()方法时,如果实际数据没有准备好,程序就会被阻塞,等待RealData准备好并注入到FutureData;(即它是RealData的代理,封装了获取RealData的等待过程)
JDK中的Future模式
Callable接口只有call()方法,会返回需要构造的实际数据。如果需要实现自己的业务系统,需要实现自己的callable对象。
通常会使用Callable实例构造一个FutureTask实例,并提交给线程池。
下面展示内置future模式的使用:
package future;
import java.util.concurrent.Callable;
/**
* Created by on 17/10/8.
*/
public class RealDataCallable implements Callable<String> {
private String param;
public RealDataCallable(String param) {
this.param = param;
}
@Override
public String call() throws Exception {
StringBuffer sb = new StringBuffer();
for (int i = 0; i< 10; i++) {
sb.append(param);
Thread.sleep(10);
}
return sb.toString();
}
}
package future;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
/**
* Created by lican on 17/10/8.
*/
public class FutureMain {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> futureTask = new FutureTask<String>(new RealDataCallable("a"));
ExecutorService executorService = Executors.newFixedThreadPool(1);
//执行futuretask,相当于client.request()发送请求
//在这里开启线程进行RealData的call()执行;
executorService.submit(futureTask);
System.out.println("执行完毕");
//模拟业务的额外业务逻辑处理
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//相当于data.getResult(),取得call()方法的执行)
//如果call没有执行完毕,会依然等待
System.out.print(futureTask.get());
}
}
代码中,首先构造FutureTask对象实例,表示该任务有返回值;
构造FutureTask时,使用Callable接口,告诉FutureTask需要的数据如何产生;
FutureTask交给线程池,会立即返回,不会阻塞;然后业务不需要关心数据如何产生,可以去做额外的事,需要时通过Future.get方法得到;
Future接口的方法有:
boolean cancle(boolean may);
boolean isCancelled();
boolean isDone();