一、Future模式
思想:
当service(Main方法模拟)请求一个数据的时候,可以先给他返回一个包装类(空壳,代理对象,未来data,FutureData)
然后开一个线程去异步加载真实数据,这样当service收到FutrueData,就可以做其他业务逻辑,
思想:
当service(Main方法模拟)请求一个数据的时候,可以先给他返回一个包装类(空壳,代理对象,未来data,FutureData)
然后开一个线程去异步加载真实数据,这样当service收到FutrueData,就可以做其他业务逻辑,
当要用的时候,再从FutureData中的方法去加载真实数据。(类似ajax的思想)
启动程序:模拟一个请求
/**
* 模拟一个service请求
*/
public class Main {
public static void main(String[] args) throws InterruptedException {
/**
* 未来模式的执行类,提供处理请求的方法handleRequest
*/
FutureExcutor fc = new FutureExcutor();
/**
* 1、Data是一个接口,提供实现类FuctureData和RealData
* 2、未来模式执行类,先给我们返回一个FuctureData,然后开了一个线程去加载真实数据了
*
*/
Data data = fc.handleRequest("请求参数");
/**
* 收到FutureData后,可以去处理其他业务逻辑
*/
System.out.println("做其他的事情...");
/**
* 1、处理完其他,要调用未来数据FutureData的方法加载真实数据了
* 1.1、这个getResultData肯定的是阻塞的,因为不确定真实数据是否加载成功,只有当setResultData调用了,才能把阻塞打开
* 所以这两个方法getResultData、setResultData可以用阻塞队列来实现SynchronousQueue
* 1.2、这里采用的是wait,notify,synchronized来实现的
*/
String result = data.getResultData();
System.out.println(result);
}
}
/**
* Future模式执行器
*/
public class FutureExcutor {
public Data handleRequest(final String queryStr){
//1 我想要一个代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经接收到,可以做其他的事情
final FutureData futureData = new FutureData();
//2 启动一个新的线程,去加载真实的数据,传递给这个代理对象
new Thread(new Runnable() {
@Override
public void run() {
//3 这个新的线程可以去慢慢的加载真实对象,然后传递给代理对象
RealData realData = new RealData(queryStr);
futureData.setRealData(realData);
}
}).start();
return futureData;
}
}
/**
* 数据接口
*/
public interface Data {
/**
* 提供结果的接口
* @return
*/
String getResultData();
}
/**
* future数据实现Data
*/
public class FutureData implements Data{
private RealData realData ;
private boolean isReady = false;
public synchronized void setRealData(RealData realData) {
//如果已经装载完毕了,就直接返回
if(isReady){
return;
}
//如果没装载,进行装载真实对象
this.realData = realData;
isReady = true;
//进行通知
notify();
}
@Override
public synchronized String getResultData() {
//如果没装载好 程序就一直处于阻塞状态
while(!isReady){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//装载好直接获取数据即可
return this.realData.getResultData();
}
}
/**
* 真实数据
*/
public class RealData implements Data{
private String result ;
public RealDat