多线程设计模式——Future模式

Future模式有点类似于商品订单。比如在网购时,当看重某一件商品事,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或操作其他内容。

 

代码实现:

public interface Data {

	String getRequest();
	
}
public class RealData implements Data {
	
	private String result;
	
	public RealData(String result) {
		System.out.println("根据" + result + "查询数据,这是一个耗时的过程。。。");
		try {
			System.out.println("这里查询需要耗时5秒");
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("查询完成");
		this.result = "查询结果";
	}

	@Override
	public String getRequest() {
		return result;
	}

}
public class FutureData implements Data {
	
	private RealData realData = null;
	
	@Override
	public synchronized String getRequest() {
		if(this.realData == null) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		return realData.getRequest();
	}
	
	public synchronized void setRequest(RealData realData) {
		if(this.realData != null) {
			return;
		}
		
		this.realData = realData;
		
		//唤醒阻塞的其他调用getRequest的线程
		notify();
	}

}
public class FutureClient {

	public Data getRequest(final String string) {
		final FutureData data = new FutureData();
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				RealData realData = new RealData("请求参数");
				data.setRequest(realData);
			}
		}).start();
		
		return data;
	}

}
public class Main {

	public static void main(String[] args) {
		FutureClient futureClient = new FutureClient();
		Data data = futureClient.getRequest("请求参数");
		
		System.out.println("做其他事。。。。");
		
		String result = data.getRequest();
		System.out.println(result);
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值