利用代理模式的代理类来 notifyAll() ,wait();
public interface Data {
public String getResult();
}
public class RealData implements Data{
protected String result;
public RealData(String para){
StringBuffer sb= new StringBuffer();
for(int i=0;i<10;i++){
sb.append(para);
//模拟慢
try{
Thread.sleep(1000);
}catch(Exception e){
}
result= sb.toString();
}
}
@Override
public String getResult() {
return result;
}
}
public class FutureData implements Data{
protected RealData realData =null;
protected boolean isReady = false;
public synchronized void setRealData(RealData realData){
if(isReady){
return;
}
this.realData=realData;
isReady=true;
notifyAll();
}
@Override
public synchronized String getResult() {
while(!isReady){
try{
wait();
}catch (Exception e){
}
}
return realData.result;
}
}
public class Client {
public Data request(final String queryStr){
final FutureData future = new FutureData();
//开启一个新的线程来构造真实数据
new Thread(){
public void run(){
RealData realData = new RealData(queryStr);
future.setRealData(realData);
}
}.start();
return future;
}
}
测试
public class Main {
public static void main(String[] args){
Client client = new Client();
//理解返回一个FutureData
Data data = client.request("name"); //让一个线程start,就绪状态
System.out.println("请求发送成功,正在处理中,耐心等待。。。");
String result=data.getResult(); //执行这个方法,会wait; 线程从就绪状态到执行状态,通知 ;返回数据
System.out.println("数据 = "+ result);
}
}