15 Future模式

6.2 Future模式

Future模式:页面是异步的进行后台处理,用户无需一直等待请求的结果,可以继续浏览或者操作其他内容。

 

 

代码模拟Future模式:

/**

 * 主函数,先发送请求,启动一个线程去执行查询

 * 当前线程继续并发执行

 */

public class Main {

 

public static void main(String[] args) {

FutureClient fc = new FutureClient();

//请求参数的时候,启动了一个线程去执行了,但是没有立即返回结果,需要时间计算

Data data = fc.request("请求参数");

System.out.println("请求发送成功..");

System.out.println("做其他的事情....");

//在真正需要结果的时候,去得到结果,如果那个线程已经结果并得到结果,会立即返回结果

//否则会等待

String result = data.getRequest();

System.out.println(result);

}

}

/**

 * 接受请求的时候启动一个线程并发执行获取结果

 * @author Vision_TXG

 *

 */

public class FutureClient {

 

public Data request(final String queryStr) {

final FutureData futureData = new FutureData();

new Thread(new Runnable() {

 

@Override

public void run() {

// TODO Auto-generated method stub

RealData realData = new RealData(queryStr);

futureData.setRealData(realData);

}

}).start();

//先返回一个中间存放结果类的对象

return futureData;

}

}

 

/**

 * data接口

 * @author Vision_TXG

 *

 */

public interface Data {

public String getRequest();

}

 

/**

 * 中间保存结果类,防止脏读(因为是不同的线程在执行get和set),对其加锁

 * @author Vision_TXG

 *

 */

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 getRequest() {

// TODO Auto-generated method stub

while(!isReady) {

try {

wait();

}catch(Exception e) {

e.printStackTrace();

}

}

return this.realData.getRequest();

}

 

}

 

 

/**

 * 获取真正数据的类,获取后放到中间结果类中

 * @author Vision_TXG

 *

 */

public class RealData implements Data {

 

private String result;

public RealData(String queryStr) {

System.out.println("根据" + queryStr + "进行查询,这是一个很耗时得到操作...");

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("操作完毕,获取结果");

result = "查询结果";

}

@Override

public String getRequest() {

// TODO Auto-generated method stub

return result;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值