一、Future模式
Futrue模式:对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果是再取真实的结果。
二、Future模式Demo
公共的数据接口,真实数据和未来数据都要实现该接口
package ConcurrentProgramming.middle.part3.Future;
/**
* @Author: zdj
* @Description: 公共数据接口 FutureData 和 RealData都要实现
* @Date: 2019年03月14日 14:54
*/
public interface Data {
String getRequest();
}
FutureData,未来数据。客户端发出请求时,直接响应该对象,通知客户端请求已经接受到,正在处理。
package ConcurrentProgramming.middle.part3.Future;
import javax.annotation.Resource;
/**
* @Author: zdj
* @Description: 未来数据,客户端发出请求时,直接响应该对象,通知客户端请求已经接受到,正在处理。
* @Date: 2019年03月14日 14:55
*/
public class FutureData implements Data {
private RealData realData;
/**
* 用来判断数据是否准备完毕
*/
private boolean ready = false;
public synchronized void setRealData(RealData realData) {
//如果数据准备完毕直接返回
if (ready) {
return;
}
//数据未准备,则装载数据
this.realData = realData;
ready = true;
//唤醒阻塞线程
notify();
}
public synchronized String getRequest() {
//没有准备好数据,阻塞
if (!ready){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//准备好直接返回
return this.realData.getRequest();
}
}
真实数据,客户端发出请求后,FutureData未来数据要加载的数据
package ConcurrentProgramming.middle.part3.Future;
/**
* @Author: zdj
* @Description: 真实数据,客户端发出请求后,FutureData未来数据要加载的数据
* @Date: 2019年03月14日 14:57
*/
public class RealData implements Data {
private String result;
public RealData(String queryStr){
System.out.println("根据" + queryStr + "进行查询,这是一个很耗时的操作..");
try {
Thread.sleep(5000);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("操作完毕,获取结果。。。");
result = "结果来了";
}
public String getRequest() {
return result;
}
}
客户端
package ConcurrentProgramming.middle.part3.Future;
/**
* @Author: zdj
* @Description: 客户端
* @Date: 2019年03月14日 15:27
*/
public class FutureClient {
public Data request(final String queryStr){
//1、先返回一个空的数据给客户端,告诉客户端请求已经收到,正在获取数据
final FutureData futureData = new FutureData();
//2、启动一个新的线程,去加载真实的数据,获取完毕后,将真实数据返回给客户端
new Thread(new Runnable() {
public void run() {
RealData realData = new RealData(queryStr);
futureData.setRealData(realData);
}
}).start();
//先返回FutureData,异步加载真实数据
return futureData;
}
}
测试Main
package ConcurrentProgramming.middle.part3.Future;
/**
* @Author: zdj
* @Description: Future模式 先返回给客户端一个空的数据,告诉客户端请求收到,
* 异步去加载真实数据。当客户端真正使用数据的时候,返回给客户端真实数据
* 此时如果数据没有加载完毕,则会阻塞线程,直至数据加载完毕。
* @Date: 2019年03月14日 15:31
*/
public class Main {
public static void main(String[] args) {
FutureClient futureClient = new FutureClient();
Data data = futureClient.request("请求参数");
System.out.println("请求发送成功!");
System.out.println("做其他的事情...");
String result = data.getRequest();
System.out.println(result);
}
}
运行结果
参考链接:https://www.cnblogs.com/plxx/p/4574141.html