package demo4;
public interface Data {
String getRequest();
}
package demo4;
public class RealData implements Data {
private String result;
public RealData(String queryStr){
System.out.println("根據(jù)" + queryStr + "進(jìn)行查詢,這是一個很耗時的操作");
try{
Thread.sleep(5000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("操作完畢,獲得結(jié)果");
result = "查詢結(jié)果";
}
@Override
public String getRequest() {
return result;
}
}
package demo4;
public class FutureData implements Data {
private RealData realData;
private boolean isReady = false;
public synchronized void setRealData(RealData realData) {
// 如果已經(jīng)裝載完成了脊框,就直接返回
if (isReady) {
return;
}
// 如果沒有裝載完窟扑,進(jìn)行裝載真實對象
this.realData = realData;
isReady = true;
notify();
}
public synchronized String getRequest() {
// 如果沒有裝載好孽亲,程序就一直處理阻塞狀態(tài)
while (!isReady) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 裝載好直接讀取數(shù)據(jù)即可
return this.realData.getRequest();
}
}
package demo4;
public class Main {
public static void main(String[] args) {
FutureClient fc = new FutureClient();
Data data = fc.request("請求參數(shù)");
System.out.println("請求發(fā)送成功涯肩!");
System.out.println("做其他的事情...");
String result = data.getRequest();
System.out.println(result);
}
}
package demo4;
public class FutureClient {
public Data request(final String queryStr) {
// 1被辑、我想要一個代理對象(Data接口的實現(xiàn)類)先返回給發(fā)送請求的客戶端挽封,告訴他請求已經(jīng)收到已球,可以做其他的事情
final FutureData futureData = new FutureData();
// 2、啟動一個新的線程辅愿,去加載真實的數(shù)據(jù)智亮,傳遞給這個代理對象
new Thread(new Runnable() {
@Override
public void run() {
// 3、這個新的線程可以去慢慢地加載這個真實對象点待,然后傳遞給代理對象
RealData realData = new RealData(queryStr);
futureData.setRealData(realData);
}
}).start();
return futureData;
}
}