每天一例多线程[day15]----Future模式之美丽的谎言

Future模式的适用场景是:想要得到数据时,先返回数据的包装,异步获取真实数据,真正需要时再拿数据,真实数据也许已经异步得到,也许还在阻塞获取中...

       这有点像BOSS布置任务,比如由于市场需要,将在本月20号发布一个版本,今天是10号,分配任务给小弟去做了,询问小弟能不能搞定,由于小弟着急上位就答应了。而BOSS忙着处理每天的商务问题,在20号之前都没有空理会给小弟分配的任务。

    不知不觉时间到了20号,这时BOSS赶忙询问小弟做的到底如何了,其实这个时候小弟还差10%没有搞定,但是不想影响自己以后的信誉就回答已经搞定了,准备晚上部署,BOSS拍了拍小弟肩膀说“好样的!过一段给你加薪!”,BOSS走开后,小弟立刻拿出自己吃奶的力气,最终在晚上部署前完成了任务。

     思想就是发起请求后会立即返回一个数据给你,但是这个数据只是个包装,包装数据会异步请求真实数据,最终用的时候去拿真实的数据,可能异步加载完成直接返回,也可能未完成阻塞着。

     再比如情人节到了,女朋友问你准备礼物了没有,明明忘记了,但是依然说准备了,然后偷偷赶紧网购个,对吧!起码事情算是圆满了。

public interface Data {

	String getRequest();

}
public class FutureData implements Data{

	private RealData realData ;
	
	private boolean isReady = false;
	
	public Thread currentThread;
	
	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 class RealData implements Data{

	private String result ;
	
	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;
	}

}
public class FutureClient {

	public FutureData request(final String queryStr){
		//1 我想要一个代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经接收到,可以做其他的事情
		final FutureData futureData = new FutureData();
		//2 启动一个新的线程,去加载真实的数据,传递给这个代理对象
		Thread t = new Thread(new Runnable() {
			@Override
			public void run() {
				//3 这个新的线程可以去慢慢的加载真实对象,然后传递给代理对象
				RealData realData = new RealData(queryStr);
				futureData.setRealData(realData);
			}
		});
		t.start();
		futureData.currentThread = t;
		return futureData;
	}
	
}

public class Main {

	public static void main(String[] args) throws InterruptedException {
		
		FutureClient fc = new FutureClient();
		FutureData data = fc.request("请求参数");
		System.out.println("请求发送成功!");
		System.out.println("做其他的事情..."+"请求数据线程状态:"+data.currentThread.getState());
		//经测试代码阻塞在这一行,等待获取真实数据,而 以上代码则实时执行
		String result = data.getRequest();
		System.out.println(result+"请求数据的线程状态:"+data.currentThread.getState());
		
	}
}









猜你喜欢

转载自blog.csdn.net/shengqianfeng/article/details/80603340
今日推荐