多线程程序设计学习(10)Future pattern

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 }
View Code

蛋糕类

 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 }
View Code

取蛋糕的票据

 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 }
View Code

开启制作蛋糕线程的类

 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 }
View Code

模拟主线程,先做蛋糕,去忙别的事,忙完取蛋糕的类

 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 }
View Code
原文地址:https://www.cnblogs.com/shangxiaofei/p/4671504.html