future的原理

1、主进程不用关心和等待实际处理的情况
背景:主线程发送一个请求去买包子(实际会花费2秒钟),期间需要修车(需要5秒钟),需要在最短时间内完成任务。理想状态是5秒钟。

主线程需要:发送安排一个人去买包子,一个人修车
public static void main(String[] args) throws Exception {
FutureClient fu = new FutureClient();
System.out.println(“主进程发送请求”);
Data data = fu.request(“请求参数”);
new Thread(new Runnable() {
@Override
public void run() {
int count = 0;
while(count < 5)
{
try {
Thread.sleep(1000);
count++;
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("…");
}
}
}).start();
String result = data.getRequst();
System.out.println(“结果回来了:”+ result);
}

执行结果:
主进程发送请求
真实查询参数已经接受,准备处理请求


真实数据处理完毕,返回结果给主进程
结果回来了:success


辅助类:
public interface Data {
String getRequst();
}

买包子:
public class RealData implements Data{

private String result;
public RealData(String param) {
	System.out.println("真实查询参数已经接受,准备处理请求");
	try {
		Thread.sleep(2000);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	System.out.println("真实数据处理完毕,返回结果给主进程");
	result = "success";
}
@Override
public String getRequst() {
	return result;
}

}

买包子的路上:
public class FutrueData implements Data{
boolean isReady = false;
private RealData realData;
@Override
public synchronized String getRequst() {
while (!isReady)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return this.realData.getRequst();
}
public synchronized void setData(RealData realData) {
if (isReady)
{
return;
}
this.realData = realData;
isReady = true;
notify();
}
}

创建买包子的任务:
public class FutureClient {
public Data request(final String param)
{
final FutrueData data = new FutrueData();
//先定义一个数据模型返回去,实际的在线程中执行。达到不阻塞主线程
new Thread(new Runnable() {
@Override
public void run() {
synchronized (data) {
final RealData realData = new RealData(param);
data.setData(realData);
}
}
}).start();
return data;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值