Future模式的实现方式
- Data 数据接口
public interface Data {
String getRequest();
}
- FutureClient:对外统一类
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;
}
}
- FutureData: 代理类
public class FutureData implements Data {
private RealData realData;
private volatile boolean isReady = false;
public synchronized void setRealData(RealData data){
// 如果已经装载完毕,就直接返回
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();
}
}
FutureTask 的三种状态
-
未启动
FutureTask.run()方法还没有被执行之前,FutureTask处于未启动状态。当创建一个FutureTask,且没有执行FutureTask.run()方法之前,这个FutureTask处于未启动状态。
-
已启动
FutureTask.run()方法被执行的过程中,FutureTask处于已启动状态
-
已完成
FutureTask.run()方法执行完成后正常结束,或被取消或异常结束,FutureTask处于已完成状态。
当一个线程需要等待另外一个线程把某个任务执行完后它才能继续被执行,此时可以使用FutureTask。
假设有多个线程执行 若干任务,每个任务最多只能被执行一次。当多个线程试图同时执行同一个任务时,只允许一个线程执行任务,其他线程需要等待这个任务执行完后才能继续执行。