并发编程之Future模式

本文探讨了Future模式在多线程开发中的应用,通过异步调用提高程序效率,减少等待时间,展示了Future模式如何在高并发场景下优化业务处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Future模式和多线程技术密切相关,可以说是利用多线程技术优化程序的一个实例。
Future模式的核心在于使用多线程技术去除了主函数中的等待时间,并使得原来需要等待的时间段可以用于处理其他的业务逻辑,从而充分利用计算机资源。

2.Future模式是多线程开发中常见的设计模式,它的核心思想是异步调用。对于Future模式来说,它无法立即返回你需要的数据,但是它会返回一个契约,将来你可以凭借这个契约去获取你需要的信息。

3.代码示例
a.抽象接口Data.java

/**
 * 抽象接口
 * @author shixiangcheng
 * 2019-08-12
 */
public interface Data {
	String getRequest();
}

b.包装类FutureData.java

/**
 * 包装类
 * @author shixiangcheng
 * 2019-08-12
 */
public class FutureData implements Data {
	private RealData realData;
	private boolean isReady=false;
	public synchronized void setRealData(RealData realData){
		//若已经装载完毕,则直接返回
		if(isReady){
			return;
		}
		//若没装载,则进行装载真实对象
		this.realData=realData;
		isReady=true;
		//进行通知
		this.notify();
	}
	@Override
	public synchronized String getRequest() {
		//若没装载好,则程序一直处于阻塞状态
		while(!isReady){
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//装载好直接获取数据
		return this.realData.getRequest();
	}
}

c.真实类RealData.java

/**
 * 真实类
 * @author shixiangcheng
 * 2019-08-12
 */
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;
	}
}

d.客户端FutureClient.java

/**
 * 客户端
 * @author shixiangcheng
 * 2019-08-12
 */
public class FutureClient {
	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;
	}
}

e.主函数

/**
 * 主函数
 * @author shixiangcheng
 * 2019-08-12
 */
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);
	}
}

运行结果

请求发送成功
做其它的事情
服务请求参数开始执行,这是一个很耗时的操作
执行完毕
返回结果

4.总而言之, Future模式对于多线程而言,如果线程A要等待线程B的结果,那么线程A没必要一直等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果时再取真实的结果值。
Future模式在高并发场景下是非常常见的使用套路,分布式开发中,大数据量的业务处理往往都会比较耗时,例如数据统计功能、日志备份功能,列表查询功能等,
并行设计模式是设计优化的一部分,在大型 JAVA企业级应用中,对常用的多线程结构的总结和抽象。与串行程序相比,并行程序的结构通常更为复杂。合理地使用并行模式在多线程开发中,对应用的底层架构代码搭建有着牢固地基的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值