public interface Data {
String getRequest();
}
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;
//进行通知
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 + "进行查询,耗时4s");
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("查询完成,获取到结果");
result = "&¥@&#*¥@*&";
}
@Override
public String getRequest() {
return result;
}
}
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
futureData.setRealData(realData);
}
}).start();
//先返回一个代理对象
return futureData;
}
}
public class Main {
/**
* 主线程执行request方法,返回的是Data的实现类对象futureData,继续向下执行
* 通过getRequest()获取数据,此时的isReady为false,线程处于等待状态
* 执行request方法时开启一个子线程,去创建RealData对象,realData对象即为真实数据
* 一段时间过后realData对象创建成功,执行:futureData.setRealData(realData)
* 此时FutureData类中的成员变量realData的值被设置成功,同时将isReady设为true,唤醒等待的线程,成功获取realData
*/
public static void main(String[] args) {
FutureClient futureClient = new FutureClient();
Data futureData = futureClient.request("123");
System.out.println("请求发送成功!");
System.out.println("做其他的事情...");
String result = futureData.getRequest();
System.out.println(result);
}
}
请求发送成功!
做其他的事情...
根据参数:123进行查询,耗时4s
查询完成,获取到结果
&¥@&#*¥@*&
Process finished with exit code 0
执行过程: