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; } } |