多线程程序设计学习(10)Future pattern
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的更多相关文章
- 多线程程序设计学习(2)之single threaded execution pattern
Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResourc ...
- 多线程程序设计学习(3)immutable pattern模式
Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者 1.1:immutable参与者是一个 ...
- 多线程程序设计学习(13)Active Object pattern
Active Object[接收异步消息的对象] 一:Active Object的参与者--->客户端线程(发起某种操作请求处理)--->代理角色(工头)--->实际执行者(工人)- ...
- 多线程程序设计学习(12)Thread-soecific storage pattern
Thread-Specific-Storage[线程保管箱] 一:Thread-Specific Storage的参与者--->记录日志的线程(ClientThread)--->负责获取不 ...
- 多线程程序设计学习(11)Two-phapse-Termination pattern
Two-phapse-Termination[A终止B线程] 一:Two-phapse-Termination的参与者--->A线程--->B线程 二:Two-phapse-Termina ...
- 多线程程序设计学习(9)worker pattern模式
Worker pattern[工作模式]一:Worker pattern的参与者--->Client(委托人线程)--->Channel(通道,里边有,存放请求的队列)--->Req ...
- 多线程程序设计学习(7)read-write lock pattern
Read-Write Lock Pattern[读写]一:Read-Write Lock Pattern的参与者--->读写锁--->数据(共享资源)--->读线程--->写线 ...
- 多线程程序设计学习(5)balking模式和timed模式
Balking[返回模式]timed[超时模式]一:balking pattern的参与者--->GuardedObject(被警戒的对象) --->该模式的角色:模拟修改警戒对象的线程, ...
- 多线程程序设计学习(6)Producer-Consumer模式
Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程 ...
随机推荐
- 【IOS】分享下近一年IOS开发的经验总结
从上个暑假末到现在,自己做IOS开发也快一年了.从一开始的什么都不知道,到现在大多事都能搭上一两手,期间经历了很多事情.下面来和大家分享一下心得和感触. 1.现在移动领域的知识更新的很快,无论是IOS ...
- Jplayer(转)
Jplayer必须要加载 1.样式 jplayer.blue.monday.css 2.jq jquery.1.6.2.min.js 当前最新版本为1.6.2 3.jplayer的js jquery ...
- linux 批量重命名文件
模拟结果文件路径结构大概是:/当前目录/模型名/字模型名模拟/模拟温度/模拟结果文件. 模拟结果文件命名时相同的.模拟结果文件需要修改模拟结果文件的后缀名. 附shell脚本: find -type ...
- 为什么要在<button>元素中添加type属性
在HTML中<button> 标签定义一个按钮. <button type="button">Click Me!</button> 在 butt ...
- IntPtr
一:什么是IntPtr 先来看看MSDN上说的:用于表示指针或句柄的平台特定类型.这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄.它是一个平台特定类型.对于它的解释,这个哥们写的比较 ...
- java 取小数点后两位 不四舍五入,怎么做
java 取小数点后两位 不四舍五入,怎么做 正常版: //正常版: import java.text.DecimalFormat; import java.math.RoundingMode; De ...
- BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆
Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 &l ...
- Windows下的Memcache安装与测试教程
Windows下的Memcache安装 1.下载memcache for windows. 下载地址:http://splinedancer.com/memcached-win32/,推荐下载bina ...
- 成功解决Tomcat-JDBC-MySQL乱码
0.MySQL-JDBC驱动文档 官方解释 1.数据库的字符编码和表内字段的编码 在MySQL中数据库的字符编码和表内字段的编码的要指定为utf8(utf8_general_ci) 2.jsp中 pa ...
- hdu 3927 Math Geek
纯数论题,不解释!!!! 代码如下: #include<stdio.h> int main(){ ,m; scanf("%d",&t); while(t--){ ...