Java并发程序设计(十)设计模式与并发之Future模式

设计模式与并发之Future模式

核心思想:异步调用。

 

1 /**
2  * @author: Tang Jiujia
3  * @version: 2017/9/18 0018 15:22
4  */
5 public interface Data {
6 
7     String getResult();
8 }
 1 /**
 2  * @author: Tang Jiujia
 3  * @version: 2017/9/18 0018 15:23
 4  */
 5 public class RealData implements Data{
 6 
 7     protected final String result;
 8 
 9     public RealData(String para){
10         StringBuffer bf=new StringBuffer();
11         for (int i=0;i<10;i++){
12             bf.append(para);
13             try{
14                    Thread.sleep(100);
15                 }catch (Exception e){
16                     e.printStackTrace();
17                 }
18         }
19         result=bf.toString();
20     }
21 
22     @Override
23     public String getResult() {
24         return result;
25     }
26 }
 1 public class FutureData implements Data{
 2 
 3     protected RealData realData=null;
 4     protected boolean isReady=false;
 5 
 6     public synchronized void setRealData(RealData realData){
 7         if(isReady){
 8            return;
 9         }
10 
11         this.realData=realData;
12         isReady=true;
13         notifyAll();
14     }
15 
16     @Override
17     public synchronized String getResult() {
18         while (!isReady){
19             try{
20                  wait();
21                 }catch (Exception e){
22                     e.printStackTrace();
23                 }
24         }
25         return realData.result;
26     }
27 }
 1 public class Client {
 2 
 3     public Data request(final String queryStr){
 4         final FutureData futureData=new FutureData();
 5         new Thread(){
 6             @Override
 7             public void run(){
 8                 RealData realData=new RealData(queryStr);
 9                 futureData.setRealData(realData);
10             }
11         }.start();
12 
13         return futureData; //立即返回了futureData
14     }
15 }
 1 public class MainClass {
 2 
 3     public static void main(String[] args){
 4         Client client=new Client();
 5         Data data=client.request("name");
 6         System.out.println("请求完毕");
 7         try{
 8              Thread.sleep(2000);
 9             }catch (Exception e){
10                 e.printStackTrace();
11             }
12             System.out.println("数据="+data.getResult());
13     }
14 }
Simple is important!
原文地址:https://www.cnblogs.com/Shadowplay/p/7543479.html