zoukankan      html  css  js  c++  java
  • 多线程程序设计学习(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
  • 相关阅读:
    Solr 删除数据的几种方式
    velocity 随笔
    LOG4J.PROPERTIES配置详解(转载)
    转 如何使用velocity模板引擎开发网站
    通过pinyin4j将汉字转换为全拼 和 拼音首字母
    去除数组中的重复数据
    java 转义字符
    多重背包(学习笔记)
    Team Queue
    [HAOI2008]糖果传递
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/4671504.html
Copyright © 2011-2022 走看看