一、Future模式
如果在Client远程调用的时候,Server端需要大量的时间去处理,这时候Server段先返回一个mock的对象让访问完成,Client端并不处理这个数据,而且去执行其他的程序,直到请求返回。
代码如下
1、Main方法
2、Client端
启动一个线程去调用,然后直接返回一个futrue对象。
3、接口
4、FuntureData
Funture 模式的核心。当返回后main使用getResult方法的时候,这个时候真实的数据没有没有完成,这个时候标志位是false。这个时候使用wait()方法。同时Client之前就调用set方法,这个时候如果真实数据加载完成就会把标志位设置为true。同时唤醒进程。所以最好返回的Result就是已经加载好的。
JDK的实现:
1、RealData
实现Callable接口
2、Main
如果在Client远程调用的时候,Server端需要大量的时间去处理,这时候Server段先返回一个mock的对象让访问完成,Client端并不处理这个数据,而且去执行其他的程序,直到请求返回。
代码如下
1、Main方法
public class Main {
public static void main(String[] args) {
Client client = new Client();
Data data = client.request("name");
System.out.println("request end");
try {
Thread.sleep(2000);
} catch (Exception e) {
}
System.out.println("real data" + data.getResult());
}
}
2、Client端
public class Client {
public Data request(final String string) {
final FuntureData future = new FuntureData();
new Thread() {
@Override
public void run() {
RealDate realData = new RealDate(string);
future.setRealData(realData);
}
}.start();
return future;
}
}
启动一个线程去调用,然后直接返回一个futrue对象。
3、接口
public interface Data {
public String getResult();
}
4、FuntureData
public class FuntureData implements Data {
protected RealDate realDate;
protected boolean isReady;
public synchronized void setRealData(RealDate realData) {
if (isReady) {
return;
}
this.realDate = realData;
isReady = true;
notifyAll();
}
@Override
public synchronized String getResult() {
while (!isReady) {
try {
wait();
} catch (Exception e) {
// TODO: handle exception
}
}
return realDate.getResult();
}
}
Funture 模式的核心。当返回后main使用getResult方法的时候,这个时候真实的数据没有没有完成,这个时候标志位是false。这个时候使用wait()方法。同时Client之前就调用set方法,这个时候如果真实数据加载完成就会把标志位设置为true。同时唤醒进程。所以最好返回的Result就是已经加载好的。
JDK的实现:
1、RealData
public class RealData implements Callable<String> {
private final String para;
public RealData(String para) {
this.para = para;
}
@Override
public String call() throws Exception {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 10; i++) {
sb.append(para);
try {
Thread.sleep(100);
} catch (Exception e) {
// TODO: handle exception
}
}
return sb.toString();
}
}
实现Callable接口
2、Main
public class Main {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
FutureTask<String> future = new FutureTask<String>(new RealData("a"));
ExecutorService es = Executors.newFixedThreadPool(1);
es.submit(future);
System.out.println("request end");
try {
Thread.sleep(2000);
} catch (Exception e) {
}
System.out.println("real data" + future.get());
}
}