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);
} }