手写Future模式
根据前面我所说的Futrue模式,手写一个:
分别对应的Java代码,大家拿来参考:
package FutureTest; //公共data数据接口 public abstract class Data { //方法作用 返回线程执行结果 public abstract String getRequest(); }
package FutureTest; //获取真实数据 public class RealData extends Data { private String requestData; public RealData(String requestData){ System.out.println("正在使用data进行网络请求,data"+requestData+"开始"); try { //模拟执行业务逻辑耗时时间 Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("操作执行完毕...获取结果"); //获取返回结果 this.requestData="结果"; } @Override public String getRequest() { return requestData; } }
package FutureTest; //当有线程想要获取RealData时候,程序会被阻塞。等到RealData被注入才会使用getReal()方法 public class FutureData extends Data{ private boolean FLAG = false; private RealData realData; //读取data数据 public synchronized void setRealData(RealData realData){ //读取结果 if (FLAG) { //true 说明已经获取到结果了 如果获取到则直接返回结果 } //如果flag是false,没有获取到数据,传递realData对象 this.realData=realData; FLAG=true; //获取到执行结果 改为true notify();//唤醒 } @Override public synchronized String getRequest() { while (!FLAG) { //如果false 一直等待 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } return realData.getRequest(); } }
package FutureTest; public class FutureClient { //用户请求时候就会调用这个方法 public Data request(String requestData){ FutureData futureData = new FutureData(); //开启一个线程 new Thread(new Runnable() { public void run() { //会有阻塞 但是不影响到主线程 RealData realData= new RealData("toov5"); //执行业务逻辑 然后返回结果 futureData.setRealData(realData); //把加载到的值(返回结果)设置给他 } }).start(); return futureData; } }
启动类主函数:
package FutureTest; public class Main { public static void main(String[] args) { FutureClient futureClient = new FutureClient(); Data request = futureClient.request("cone on"); System.out.println("数据发送成功"); //主线程 System.out.println("主线程继续干自己的"); String result = request.getRequest(); System.out.println("主线程去获取结果"+result); } }
结果:
大家对应着上一篇博客好好研究下,这个模式的应用场景还是蛮多的。代码挺有趣的。
当要获取资源的时候,data.getResult() ,如果资源没有准备好false;那么就会阻塞该线程。直到资源获取然后该线程被唤醒。