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. 域名转化到IP地址的实现

    在linux中,有一些函数可以实现主机名和地址的转化,最常见的有gethostbyname().gethostbyaddr()等,它们都可以实现IPv4和IPv6的地址和主机名之间的转化.其中geth ...

  2. FPGA串口波特率简析

    以前用单片机,一直都是直接用就行,设置波特率时,直接写9600就行,一直没有仔细考虑过,今天打算用FPGA写个串口程序时才知道,原来根本就是没弄明白.一下是我的一些见解.如果诸位看官觉得不对,欢迎指正 ...

  3. 十五、mysql 分区之 分区管理

    1.mysql分区处理分区字段NULL值的方式 1.range分区null被当作最小值处理 2.list分区null值必须被枚举出来,否则将出错 3.hash/key分区 null值当作0处理 2.R ...

  4. Java - 选择性排序 PHP || Java 代码对比

    int [] array1 = {1,3,5,7,9,10,2,15,154,10,2,188,200};//定义一个数组,内容为混乱大小 int index = 0;//定义一个最大值或最小值的位置 ...

  5. 一个Makefile

    CC = g++ CCFLAGS = -O3 -DNDEBUG INC = -I ../../include SRC = $(wildcard *.cpp) OBJ = $(patsubst %.cp ...

  6. Contest2037 - CSU Monthly 2013 Oct (problem D :CX and girls)

    [题解]: 最短路径问题,保证距离最短的同时,学妹权值最大,哈哈 [code]: #include<iostream> #include<queue> #include< ...

  7. 3.7 spring-property 子元素的使用与解析

    1.0 Property子元素的使用 property 子元素是再常用不过的了, 在看Spring源码之前,我们先看看它的使用方法, 1. 实例类如下: public class Animal { p ...

  8. struts2 action中传递两个参数到url

    <action name="outInDetail" class="formManage_outInDetailAction"> <resul ...

  9. [itint5]最大子矩阵和

    http://www.itint5.com/oj/#39 最大子矩阵和,复杂度O(n^3).利用了最大子段和的方法. int maxRectSum(vector<vector<int> ...

  10. Qt的版本历史

    发展史 Qt的第一个商业版本于1995年推出,随后Qt的发展就很快了,下面是Qt发展史上的一 些里程碑,从之前的Qt1.x开始到现在的Qt5.x. Qt1-3 版本 发布日期 1.40 10 July ...