Future模式是多线程开发中很是常见的一种设计模式。它的核心思想是异步调用。当咱们须要调用一个函数方法时。若是这个函数执行很慢,那么咱们就要进行等待。但有时候,咱们可能并不急着要结果。所以,咱们可让被调用者当即返回,让他在后台慢慢处理这个请求。对于调用者来讲,则能够先处理一些其余任务,在真正须要数据的场合再去尝试获取须要的数据。设计模式
就像咱们在网上购物,你买了一个包以后会给你生成一个电子的订单凭证,你只须要持有凭证等待包送过来就好了,这期间你能够作其余你想作的事情。bash
对于Future模式来讲,它没法当即返回你须要的数据,可是它会返回一个契约,未来你能够凭借这个契约去获取你须要的信息。多线程
在传统的同步方法中调用一些耗时的程序,须要等待一个方法完成后才能进行下一步。而Future模式中客户端调用完成后并不急于去作处理,而去调用其余的业务,这样充分利用了时间,这就是Future模式的核心。app
Data接口,这个是客户端但愿获得的数据。异步
public interface Data {
public String getResult();
}
复制代码
RealData是最终须要使用的数据模型,使用sleep()模拟构造过程。ide
public class RealData implements Data {
public final String result;
public RealData(String result) {
System.out.println("RealData start " + System.currentTimeMillis());
//模拟构造时间长
StringBuffer sb = new StringBuffer();
for (int i = 0;i<10;i++){
sb.append(result);
try{
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("RealData end " + System.currentTimeMillis());
this.result = sb.toString();
}
@Override
public String getResult() {
return result;
}
}
复制代码
FutureData实现一个快速返回RealData包装函数
public class FutureData implements Data {
public RealData realData = null;
public boolean isReady = false;
public synchronized void setRealData(RealData realData){
if (isReady){
return;
}
this.realData = realData;
isReady = true;
this.notifyAll(); //realData已经被注入 通知getResult启动
}
@Override
public synchronized String getResult() {
while (!isReady){
try {
System.out.println("wait start " + System.currentTimeMillis());
this.wait(); //等待realData被注入
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("wait end " + System.currentTimeMillis());
return realData.result;
}
}
复制代码
客户端主要实现获取FutureData,开启构造RealData线程。ui
main方法调用发起请求。this
public class Client {
public Data request(final String queryStr){
final FutureData future = new FutureData();
new Thread(){
@Override
public void run(){
System.out.println("run start " + System.currentTimeMillis());
RealData realData = new RealData(queryStr);
System.out.println("run end " + System.currentTimeMillis());
future.setRealData(realData);
}
}.start();
//当即返回futureData
return future;
}
public static void main(String[] args) {
Client client = new Client();
//返回的futureData
Data data = client.request("name");
System.out.println("请求完成");
try{
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main end");
System.out.println(System.currentTimeMillis());
System.out.println("真实数据"+data.getResult());
}
}
复制代码
图片摘自--简书spa