一、Future模式的使用。
Future模式简述
传统单线程环境下,调用函数是同步的,必须等待程序返回结果后,才可进行其他处理。 Futrue模式下,调用方式改为异步。
Futrue模式的核心在于:充分利用主函数中的等待时间,利用等待时间处理其他任务,充分利用计算机资源。
主要角色
Main:系统启动,调用Client发出请求
Client:返回Data对象,立即返回FutureData,并开启ClientThread线程装配
RealData Data:返回数据的接口
FutureData:Futrue数据,是一个虚拟的数据,需要装配RealData RealData:真实数据,构造比较慢
二、实现代码
Main类
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); } }
FutureCliet类
public Data request(final String queryStr) { // 1 我想要一个代理对象(Data接口的实现类)先返回给发送请求的客户端, // 告诉他的请求已经收到,可以干其他事情 final FutureData futureData = new FutureData(); // 2.创建一个新的线程,去加载真是数据,传递个这个代理对象 new Thread(new Runnable() { @Override public void run() { // 3.这个新的线程可以慢慢去加载真是对象,然后传递给代理对象 RealData realData = new RealData(queryStr); futureData.setRealData(realData); } }).start(); return futureData; }
Data接口
public interface Data { String getRequest(); }
FutureData
public class FutureData implements Data { private RealData realData; private boolean isReady = false; @Override public synchronized String getRequest() { // 如果没有装载好久一直处于阻塞状态 while (!isReady) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 装载好可以直接获取数据 return this.realData.getRequest(); } public synchronized void setRealData(RealData realData) { if (isReady) { return; } this.realData = realData; isReady = true; notify(); } }
RealData
public class RealData implements Data { private String result; public RealData() { } public RealData(String queryStr) { System.out.println("根据" + queryStr + "进行查询" + "这是一个很耗时间的操作..."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("操作完毕"); result = "查询结果"; } @Override public String getRequest() { return result; } }