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!