概述
Future是未来的意思。有个方法需要运行很长时间才能得到结果。那么,与其一直等待结果,不如先拿一张“提货单”。 获取提货单并不需要很长时间。这里的“提货单”就是我们称为Future角色。
先给你一张提货单。
示例程序
- Main 向Host发出请求并获取数据的类
- Host 向请求返回FutureData的实例的类
- RealData 表示实际数据的类。构造函数的处理会花费很长时间
Main类
public class Main {
public static void main(String[] args){
System.out.println("main begin");
Host host = new Host();
Data data1 = host.request(10, "A");
Data data2 = host.request(20, "B");
Data data3 = host.request(30, "C");
System.out.println("main otherJob BEGIN");
try {
Thread.sleep(2000);
} catch (InterruptedException e){}
System.out.println("main otherJob END");
System.out.println("data1 = " + data1.getContent());
System.out.println("data2 =" + data2.getContent());
System.out.println("data3 =" + data3.getContent());
System.out.println("main END");
}
}
Host类
public class Host {
public Data request(final int count, final char c) {
System.out.println(" request(" + Count + ", " + c +" ) BEGIN");
final FutrueData future = new FutureData();
new Thread(0 {
public void run(){
RealData realdata = new RealData(count, c);
future.setRealData(readldata);
}
}.start();
System.out.println(" request(" + count + ", " + c + ") END");
return future;
}
}
Data 接口
public interface Data {
public abstract String getContent();
}
Future 类
public class FutureData implements Data {
private RealData realdata = null;
private boolean ready = false;
public synchronized void setRealData(RealData realdata) {
if (ready) {
return; // balk
}
this.realdata =realdata;
this.ready = true;
notifyAll();
}
public synchronized String getContent() {
while (!ready){
try {
wait();
} catch (InterruptedException e) {}
}
return realdata.getContent();
}
}
RealData 类
public class RealData implements Data {
private final String content;
public RealData(int count, char c ) {
System.out.println(" making RealData(" + count + ", " + c +") BEGIN");
char[] buffer = new char[count];
for (){
buffer[i] = c;
try {
Thread.sleep(100);
} catch (InterruptedException e){}
}
System.out.println(" making RealData(" + count + ", " + c +") END");
this.content = new String(buffer);
}
public String getContent() {
return content;
}
}
Future 模式中的角色
- Client(请求者)
Client角色向Host角色发出请求(request),并会立即接收到请结果求的处理(返回值)-- VirtualData角色。
这里接收到的VirtualData角色实际上是Future角色。Client角色没有必要知道返回值究竟是RealData角色还是Future角色。稍后,Client角色会通过VirtualData角色来进行操作。
- Host
Host角色会创建新的线程,并开始在新线程中创建RealData角色。同时,它会将Future角色返回给Client橘色。 - VirtualData (虚拟数据)
VirtualData 角色是让Future角色与RealData角色具有一致性的角色。 - RealData ( 真实数据)
RealData角色是表示真实数据的角色。 - Future (提货单)
Future角色就是RealData角色的“提货单“,由Host角色传递给Client角色。