为初学者而著!
Java基础是初学者的起点,是帮助你从小白入门到精通必学基础课程!
B站最新录制Java300集>>> 适合准备入行开发的零基础员学习Java,基于最新JDK13、IDEA平台讲解的,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由浅入深。不仅适用于零基础的初学者,有经验的程序员也可做巩固学习。
配套学习:2022年Java300集最新录制课程上线了>>>
一、Future模式
思想:
当service(Main方法模拟)请求一个数据的时候,可以先给他返回一个包装类(空壳,代理对象,未来data,FutureData)
然后开一个线程去异步加载真实数据,这样当service收到FutrueData,就可以做其他业务逻辑,
当要用的时候,再从FutureData中的方法去加载真实数据。(类似ajax的思想)
启动程序:模拟一个请求
/**
* 模拟一个service请求
*/
public class Main {
public static void main(String[] args) throws InterruptedException {
/**
* 未来模式的执行类,提供处理请求的方法handleRequest
*/
FutureExcutor fc = new FutureExcutor();
/**
* 1、Data是一个接口,提供实现类FuctureData和RealData
* 2、未来模式执行类,先给我们返回一个FuctureData,然后开了一个线程去加载真实数据了
*
*/
Data data = fc.handleRequest("请求参数");
/**
* 收到FutureData后,可以去处理其他业务逻辑
*/
System.out.println("做其他的事情...");
/**
* 1、处理完其他,要调用未来数据FutureData的方法加载真实数据了
* 1.1、这个getResultData肯定的是阻塞的,因为不确定真实数据是否加载 成功,只有当setResultData调用了,才能把阻塞打开
* 所以这两个方法getResultData、setResultData可以用阻塞队列来实现SynchronousQueue
* 1.2、这里采用的是wait,notify,synchronized来实现的
*/
String result = data.getResultData();
System.out.println(result);
}
}
-
/**
* Future模式执行器
*/
public class FutureExcutor {
public Data handleRequest(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;
}
}
-
/**
* 数据接口
*/
public interface Data {
/**
* 提供结果的接口
* @return
*/
String getResultData();
}
-
/**
* future数据实现Data
*/
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 getResultData() {
//如果没装载好 程序就一直处于阻塞状态
while(!isRe