future模式
future模式
多线程的设计模式
future模式优点类似于商品订单。
比如:当订单处理完成后,在家等待送货上门即可,或者说我们Ajax请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或者操作其他内容。
示例demo:
public class FutureClient { /** * 在发送请求时,先返回一个futureData给生产着, * 与此同时,启动一个新的线程执行业务逻辑,没有返回真实的结果 * 在线程中,执行需要处理的业务逻辑,完成后,将处理结果存放到RealData中 * * @param queryStr / * @return Data */ public Data request(final String queryStr) { FutureData futureData = new FutureData(); new Thread(() -> { final RealData realData = new RealData(queryStr); futureData.setRealData(realData); }).start(); return futureData; } }} }
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() { while (!isReady) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } return this.realData.getRequest(); } }
public interface Data { String getRequest(); }
public class RealData implements Data { private final String result; public RealData(String queryStr) { System.out.println(“真实的逻辑处理,在这可能耗时很久…”); try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(“任务处理完了…”); String res = “业务处理的结果:” + queryStr.hashCode(); // 将处理结果赋给result result = res; } @Override public String getRequest() { return this.result; } }
public static void main(String[] args) { FutureClient futureClient = new FutureClient(); Data data = futureClient.request(“请求参数”); System.out.println(“请求发送成功”); String result = data.getRequest(); System.out.println(result); }
