Future pattern[订单取货模式]

一:Future pattern的参与者
--->Client(客户需求)
--->Host(蛋糕门店)
--->Data(票据和蛋糕的接口)
--->Future(蛋糕票据)
--->ReaData(制作蛋糕过程)

二:Future pattern模式什么时候使用
--->

三:Future pattern思考
       --->

四进阶说明        
--->

数据类接口

 package com.yeepay.sxf.thread9;
/**
* 数据接口,用于定义获取【蛋糕】成功的方法
* @author sxf
*
*/
public interface Data { /**
* 获取蛋糕的方法
* @return
*/
public abstract String getContent();
}

蛋糕类

 package com.yeepay.sxf.thread9;
/**
* 制造蛋糕的真正工作
* @author sxf
*
*/
public class RealData implements Data {
//真正的蛋糕
private String content; //制造蛋糕的过程
public RealData(String data,Integer count){
System.out.println("制造蛋糕的工作开始");
StringBuffer buffer=new StringBuffer();
for(int i=0;i<count;i++){
buffer.append(data+count);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
content=new String(buffer);
System.out.println("制造蛋糕的工作结束"); } /**
* 返回制造好的蛋糕
*/
@Override
public String getContent() {
// TODO Auto-generated method stub
return content;
} }

取蛋糕的票据

 package com.yeepay.sxf.thread9;
/**
* 取蛋糕的票据
* @author sxf
*
*/
public class FutureData implements Data {
//真正的蛋糕
private RealData data;
//蛋糕是否制造好的证据
private boolean flag=false; public synchronized void setRealData(RealData realData){
if(flag){
return;
}
this.data=realData;
this.flag=true;
//蛋糕制作成功,则唤醒取蛋糕的线程
notify();
} //通过票据获取蛋糕
@Override
public synchronized String getContent() {
// TODO Auto-generated method stub
//如果蛋糕没有制作成,去蛋糕的线程休息
while(!flag){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return data.getContent();
} }

开启制作蛋糕线程的类

 package com.yeepay.sxf.thread9;
/**
* 启动新线程去制作蛋糕
* @author sxf
*
*/
public class Host { /**
* 请求按什么标准制作蛋糕
* @param count
* @param c
* @return
*/
public Data request(final int count,final String c){
System.out.println("请求按"+c+"加"+count+"的条件制作蛋糕");
//建立这个蛋糕的票据
final FutureData futureData=new FutureData();
//制作蛋糕需要花费时间,启动新的线程,去制作蛋糕
new Thread(){ @Override
public void run() {
//制作蛋糕的线程体
RealData realData=new RealData(c, count);
//将制作好的蛋糕塞入票据中
futureData.setRealData(realData);
} }.start(); System.out.println("蛋糕是否已经收到要求,给我一张取蛋糕的票据"); return futureData; }
}

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

 package com.yeepay.sxf.thread9;
/**
* 模拟客户端
* @author sxf
*
*/
public class Test { public static void main(String[] args) {
Host host1=new Host();
Host host2=new Host();
//发送请求获取蛋糕票据
Data data=host1.request(2, "sxf");
Data data2=host2.request(3, "***");
//我可以去忙其他的事情
System.out.println("host1 Test.main(买菜做饭,到下午去取蛋糕)"); //取蛋糕
String cake=data.getContent();
String cake2=data2.getContent();
//吃蛋糕
System.out.println("Test.main(Host1)eate"+cake);
System.out.println("Test.main(Host2).eata"+cake2);
} }

多线程程序设计学习(10)Future pattern的更多相关文章

  1. 多线程程序设计学习(2)之single threaded execution pattern

    Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResourc ...

  2. 多线程程序设计学习(3)immutable pattern模式

    Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个 ...

  3. 多线程程序设计学习(13)Active Object pattern

    Active Object[接收异步消息的对象] 一:Active Object的参与者--->客户端线程(发起某种操作请求处理)--->代理角色(工头)--->实际执行者(工人)- ...

  4. 多线程程序设计学习(12)Thread-soecific storage pattern

    Thread-Specific-Storage[线程保管箱] 一:Thread-Specific Storage的参与者--->记录日志的线程(ClientThread)--->负责获取不 ...

  5. 多线程程序设计学习(11)Two-phapse-Termination pattern

    Two-phapse-Termination[A终止B线程] 一:Two-phapse-Termination的参与者--->A线程--->B线程 二:Two-phapse-Termina ...

  6. 多线程程序设计学习(9)worker pattern模式

    Worker pattern[工作模式]一:Worker pattern的参与者--->Client(委托人线程)--->Channel(通道,里边有,存放请求的队列)--->Req ...

  7. 多线程程序设计学习(7)read-write lock pattern

    Read-Write Lock Pattern[读写]一:Read-Write Lock Pattern的参与者--->读写锁--->数据(共享资源)--->读线程--->写线 ...

  8. 多线程程序设计学习(5)balking模式和timed模式

    Balking[返回模式]timed[超时模式]一:balking pattern的参与者--->GuardedObject(被警戒的对象) --->该模式的角色:模拟修改警戒对象的线程, ...

  9. 多线程程序设计学习(6)Producer-Consumer模式

    Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程 ...

随机推荐

  1. javascript insertBefore 和 appendChild

    js的appendChild()方法 :在一个元素内部追加一个子节点. js的insertBefore()方法:在一个元素内部指定的子节点之前插入子节点. 很明显,appendChild()方法只需要 ...

  2. PHPstorm 的快捷键

    // ctrl+shift+n    查找文件//  ctrl+j            插入活动代码提示//  ctrl+alt+t        当前位置插入环绕代码//  alt+insert  ...

  3. input输入框的各种样式

    输入框景背景透明: <input style="background:transparent;border:1px solid #ffffff"> 鼠标划过输入框,输入 ...

  4. js 判断文件是否存在(转载)

     js 判断文件是否存在(转载) var fso,s=filespec; // filespec="C:/path/myfile.txt"fso=new ActiveXObject ...

  5. java、js的编码、解码

    如果在地址栏挂载参数,特别是包含中文,往往要进行编码,取值时再解码,以下是java和js中编码.解码的各自方法. java: @Test public void test3() throws Unsu ...

  6. Could not load oracle/sql/converter_xcharset/lx20354.glb.

    一.错误描述: 此错误导致了web 服务器停止服务,应该属于“不能连接Oracle”的错误. 二.具体错误信息: 信息: Illegal access: this web application in ...

  7. CSS 命名规范及标题供参考与学习

    一.CSS 命名规范   XHTML-CSS写作建议 所有的xhtml代码小写 属性的值一定要用双引号("")括起来,且一定要有值 每个标签都要有开始和结束,且要有正确的层次 空元 ...

  8. [转]LINQ语句之Select/Distinct和Count/Sum/Min/Max/Avg

    在讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects.LINQ to DataSets.LINQ ...

  9. Codeforces Round #240 (Div. 2)(A -- D)

    点我看题目 A. Mashmokh and Lights time limit per test:1 secondmemory limit per test:256 megabytesinput:st ...

  10. poj 2265 Bee Maja

    题目的意思很容易理解.就是找两个不同坐标的对应关系.下面的思路转自POJ的论坛 首先,记由1到2的方向记为2,1到3的方向记为3……1到7的方向记为7,他们分别是:(0,1),(-1,1),(-1,0 ...