Future模式
类似于用户提交商品订单,下单成功以后后台异步的执行耗时的业务
在java.util.concurrent包中.Future接口是Java线程Future模式的实现,可以来进行异步计算。
1.定义一个接口来处理请求
public interface Data{
String getRequest();
}
2.定义一个转发请求的客户端
public class FutureClient{
public Data request(final String queryStr){
//1.添加一个代理对象(Data接口的实现类) 先返回给发送请求的客户端
//告诉客户端收到请求,可以处理其他事情
final FutureData futureData = new FutureData();
//2.启动一个新的线程 去加载真实的数据 传递给这个代理对象
new Thread(new Runnable(){
public void run(){
//3这个新的线程可以去慢慢的加载真实对象
//然后传递给代理对象
RealData realData = new RealData(queryStr);
futureData.setRealData(realData);
}
}).start();
return futureData;
}
}
3.定义一个代理类来返回数据
public class FutureData implements Data{
private RealData realData;
private boolean isReady = false;
public void synchronized void setRealData(RealData realData){
//如果已经转载完毕 直接返回
if(iReady){
return;
}
//如果没有装载,进行装载真实对象
this.realData = realData;
isReady = true;
//进行通知
notify();
}
public synchronized String getRequest(){
//如果没有装载好 程序就一直处于阻塞的状态
while(!isReady){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//装载好直接获取数据即可
return this.realData.getRequest();
}
}
4.定义一个处理大量耗时操作的类
public class RealData implements Data{
private String result;
public RealData(String queryStr){
System.out.println("根据" + queryStr + "进行查询,
这是一个很耗时的操作..");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("操作完毕,获取结果");
result = "查询结果";
}
public String getRequest(){
retun result;
}
}
5.定义一个测试类
public class Main{
public static void main(String[] args) throws InterruptedException {
FutureClient fc = new FutureClient();
Data data = fc.request("发送请求");
System.out.println("请求发送成功!");
System.out.println("做其他的事情...");
String result = data.getRequest();
System.out.println(result);
}
}
结果如下
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。