并行-Future模式

xiaoxiao2021-02-28  129

一、Future模式的核心:

       去除主函数的等待时间,并让原本需要等待的时间段用于处理其他的业务逻辑。

       对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果是再去取真实的结果。

        

          

        首先客户端向服务器请求RealSubject,但这个资源的创建非常耗时,这时返回Client端一个FutureSubject满足客户端的请求,同时,Future会通过创建一个Thread去真正的获取资源,资源准备完毕后,再给Future一个通知。但是如果客户端必须马上获取这个真正的资源,那么就会阻塞客户端的其他所有线程,等待资源准备完毕。

二、Future模式的实现

   Data接口:返回数据的接口

public interface Data { public String getResult(); }    RealSubject:真实的数据,其构造时比较慢的

  

public class RealSubject implements Data { protected final String result; public RealSubject(String para) { StringBuffer sb = new StringBuffer(); for(int i = 0; i < 10; i++){ sb.append(para); try { //用线程去模拟真实数据的构造 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } result = sb.toString(); } @Override public String getResult() { return result; } }

     FutureData:Future数据,构造很快,但是是一个虚拟的数据,需要装配RealSubject

public class FutureData implements Data { protected RealSubject realData = null; protected boolean isReady = false; public synchronized void setRealData(RealSubject realData){ if(isReady){ return ; } this.realData = realData; isReady = true; notifyAll(); } @Override public String getResult() { while (!isReady){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } return realData.result; }     Thread:启动线程,去获取数据

public class ClientThread { public Data request(final String queryStr){ final FutureData futureData = new FutureData(); new Thread(){ public void run(){ RealSubject realData = new RealSubject(queryStr); futureData.setRealData(realData); } }.start(); return futureData; } }

  Client:返回Data对象,立即返回FutureData,并开启ClientThread装配RealSubject

  

public class Client { public static void main(String[] args){ ClientThread clientThread = new ClientThread(); Data data = clientThread.request("name"); System.out.println("request over"); try { Thread.sleep(100000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("data = " + data.getResult()); } } 三、总结:

       Future模式核心就是去除等待时间。我们可以这么理解,Future模式本身可看做是一个显示引用和一个异步处理结果的引用。由于其异步性,未返回真实数据时,此时对象不可用,我们可以利用这段时间去处理其他业务,或进入其他分支,直到返回真实数据,再进行处理。

转载请注明原文地址: https://www.6miu.com/read-29027.html

最新回复(0)