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;

}

}

猜你喜欢

转载自blog.csdn.net/txgANG/article/details/80873575