【多线程】 Future -有返回结果

利用代理模式的代理类来 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);  
          
          
    }  
}

转载于:https://my.oschina.net/v512345/blog/918597

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值