多线程程序设计学习(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的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程 ...
随机推荐
- Oracle分析函数 — rank, dense_rank, row_number用法
本文通过例子演示了Oracle分析函数 —— rank, dense_rank, row_number的用法. //首先建score表 create table score( course nva ...
- 利用PHPRPC以及SOAP分别实现PHP的Webserver功能
服务端:phprpc服务端 <?php /* phprpc 服务端演示 * time:2014-06-23 */ require_once 'phprpc_server.php';//引入服务端 ...
- ExtJs 4.2 treePanel 点击树节点 传送参数到后台(多个参数)
//***********************************************左边树开始********************************************** ...
- 实战开发中UI资源制作标准
资源制作标准设定建议 1.所有的UI资源全部采用PNG导出 因为Unity不支持外部压缩,所以,不论是用PNG还是JPG,只要尺寸相同,资源量在引擎中都会是一样大.所以,可以大胆地采用PNG进行输出, ...
- 判断webpart类型 How can I tell what type a web part is?
using(new SPSite("http://mysite/myweb").OpenWeb()){ //give relative path of the webpartpag ...
- Python之print语句
print语句可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print 'hello, world' 注意: 1.当我们在Python交 ...
- python学习笔记3(字符串)
Python字符串: 在Python中的字符串被确定为一组连续的字符在引号之间, Python允许在任何对单引号或双引号. 串的子集,可以使用切片操作符可采用([]和[:]),索引从0开始的字符串的开 ...
- 3.4 spring- lookup-method 子元素的使用与解析
1. lookup-method的应用: 1.1 子元素lookup-method 似乎不是很常用,但是在某些时候他的确是非常有用的属性,通常我们称它为 "获取器注入" . 引用 ...
- js页面刷新一次
// var str = document.location.hash, // index = str.indexOf("#"); // if(index == 0){ // wi ...
- uc/os初始化
操作系统初始化函数OS_INIT是操作系统在开始运行的最初,对全局变量.任务控制块.就绪表.事件及消息队列等重要数据结构进行的初始化操作,并创建空闲任务.统计任务等系统任务.该函数必须在创建用 ...