Future pattern[订单取货模式]
一:Future pattern的参与者
--->Client(客户需求)
--->Host(蛋糕门店)
--->Data(票据和蛋糕的接口)
--->Future(蛋糕票据)
--->ReaData(制作蛋糕过程)
二:Future pattern模式什么时候使用
--->
三:Future pattern思考
--->
四进阶说明
--->
数据类接口
1 package com.yeepay.sxf.thread9; 2 /** 3 * 数据接口,用于定义获取【蛋糕】成功的方法 4 * @author sxf 5 * 6 */ 7 public interface Data { 8 9 /** 10 * 获取蛋糕的方法 11 * @return 12 */ 13 public abstract String getContent(); 14 }
蛋糕类
1 package com.yeepay.sxf.thread9; 2 /** 3 * 制造蛋糕的真正工作 4 * @author sxf 5 * 6 */ 7 public class RealData implements Data { 8 //真正的蛋糕 9 private String content; 10 11 //制造蛋糕的过程 12 public RealData(String data,Integer count){ 13 System.out.println("制造蛋糕的工作开始"); 14 StringBuffer buffer=new StringBuffer(); 15 for(int i=0;i<count;i++){ 16 buffer.append(data+count); 17 try { 18 Thread.sleep(1000); 19 } catch (InterruptedException e) { 20 // TODO Auto-generated catch block 21 e.printStackTrace(); 22 } 23 } 24 content=new String(buffer); 25 System.out.println("制造蛋糕的工作结束"); 26 27 } 28 29 /** 30 * 返回制造好的蛋糕 31 */ 32 @Override 33 public String getContent() { 34 // TODO Auto-generated method stub 35 return content; 36 } 37 38 39 }
取蛋糕的票据
1 package com.yeepay.sxf.thread9; 2 /** 3 * 取蛋糕的票据 4 * @author sxf 5 * 6 */ 7 public class FutureData implements Data { 8 //真正的蛋糕 9 private RealData data; 10 //蛋糕是否制造好的证据 11 private boolean flag=false; 12 13 public synchronized void setRealData(RealData realData){ 14 if(flag){ 15 return; 16 } 17 this.data=realData; 18 this.flag=true; 19 //蛋糕制作成功,则唤醒取蛋糕的线程 20 notify(); 21 } 22 23 24 25 //通过票据获取蛋糕 26 @Override 27 public synchronized String getContent() { 28 // TODO Auto-generated method stub 29 //如果蛋糕没有制作成,去蛋糕的线程休息 30 while(!flag){ 31 try { 32 wait(); 33 } catch (InterruptedException e) { 34 // TODO Auto-generated catch block 35 e.printStackTrace(); 36 } 37 } 38 return data.getContent(); 39 } 40 41 42 43 }
开启制作蛋糕线程的类
1 package com.yeepay.sxf.thread9; 2 /** 3 * 启动新线程去制作蛋糕 4 * @author sxf 5 * 6 */ 7 public class Host { 8 9 /** 10 * 请求按什么标准制作蛋糕 11 * @param count 12 * @param c 13 * @return 14 */ 15 public Data request(final int count,final String c){ 16 System.out.println("请求按"+c+"加"+count+"的条件制作蛋糕"); 17 //建立这个蛋糕的票据 18 final FutureData futureData=new FutureData(); 19 //制作蛋糕需要花费时间,启动新的线程,去制作蛋糕 20 new Thread(){ 21 22 @Override 23 public void run() { 24 //制作蛋糕的线程体 25 RealData realData=new RealData(c, count); 26 //将制作好的蛋糕塞入票据中 27 futureData.setRealData(realData); 28 } 29 30 }.start(); 31 32 System.out.println("蛋糕是否已经收到要求,给我一张取蛋糕的票据"); 33 34 return futureData; 35 36 } 37 }
模拟主线程,先做蛋糕,去忙别的事,忙完取蛋糕的类
1 package com.yeepay.sxf.thread9; 2 /** 3 * 模拟客户端 4 * @author sxf 5 * 6 */ 7 public class Test { 8 9 public static void main(String[] args) { 10 Host host1=new Host(); 11 Host host2=new Host(); 12 //发送请求获取蛋糕票据 13 Data data=host1.request(2, "sxf"); 14 Data data2=host2.request(3, "***"); 15 //我可以去忙其他的事情 16 System.out.println("host1 Test.main(买菜做饭,到下午去取蛋糕)"); 17 18 //取蛋糕 19 String cake=data.getContent(); 20 String cake2=data2.getContent(); 21 //吃蛋糕 22 System.out.println("Test.main(Host1)eate"+cake); 23 System.out.println("Test.main(Host2).eata"+cake2); 24 } 25 26 }