多线程程序设计学习(10)Future pattern

Future pattern[订单取货模式]

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

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

三:Future pattern思考
       --->

四进阶说明        
--->

数据类接口

 1 package com.yeepay.sxf.thread9;
 2 /**
 3  * 数据接口,用于定义获取【蛋糕】成功的方法
 4  * @author sxf
 5  *
 6  */
 7 public interface Data {
 8
 9     /**
10      * 获取蛋糕的方法
11      * @return
12      */
13     public abstract String getContent();
14 }

View Code

蛋糕类

 1 package com.yeepay.sxf.thread9;
 2 /**
 3  * 制造蛋糕的真正工作
 4  * @author sxf
 5  *
 6  */
 7 public class RealData implements Data {
 8     //真正的蛋糕
 9     private String content;
10
11     //制造蛋糕的过程
12     public RealData(String data,Integer count){
13         System.out.println("制造蛋糕的工作开始");
14         StringBuffer buffer=new StringBuffer();
15         for(int i=0;i<count;i++){
16             buffer.append(data+count);
17             try {
18                 Thread.sleep(1000);
19             } catch (InterruptedException e) {
20                 // TODO Auto-generated catch block
21                 e.printStackTrace();
22             }
23         }
24         content=new String(buffer);
25         System.out.println("制造蛋糕的工作结束");
26
27     }
28
29     /**
30      * 返回制造好的蛋糕
31      */
32     @Override
33     public String getContent() {
34         // TODO Auto-generated method stub
35         return content;
36     }
37
38
39 }

View Code

取蛋糕的票据

 1 package com.yeepay.sxf.thread9;
 2 /**
 3  * 取蛋糕的票据
 4  * @author sxf
 5  *
 6  */
 7 public class FutureData implements Data {
 8     //真正的蛋糕
 9     private RealData data;
10     //蛋糕是否制造好的证据
11     private boolean flag=false;
12
13     public synchronized void setRealData(RealData realData){
14         if(flag){
15             return;
16         }
17         this.data=realData;
18         this.flag=true;
19         //蛋糕制作成功,则唤醒取蛋糕的线程
20         notify();
21     }
22
23
24
25     //通过票据获取蛋糕
26     @Override
27     public synchronized String  getContent() {
28         // TODO Auto-generated method stub
29         //如果蛋糕没有制作成,去蛋糕的线程休息
30         while(!flag){
31             try {
32                 wait();
33             } catch (InterruptedException e) {
34                 // TODO Auto-generated catch block
35                 e.printStackTrace();
36             }
37         }
38         return data.getContent();
39     }
40
41
42
43 }

View Code

开启制作蛋糕线程的类

 1 package com.yeepay.sxf.thread9;
 2 /**
 3  * 启动新线程去制作蛋糕
 4  * @author sxf
 5  *
 6  */
 7 public class Host {
 8
 9     /**
10      * 请求按什么标准制作蛋糕
11      * @param count
12      * @param c
13      * @return
14      */
15     public Data request(final int count,final String c){
16         System.out.println("请求按"+c+"加"+count+"的条件制作蛋糕");
17         //建立这个蛋糕的票据
18          final     FutureData futureData=new FutureData();
19         //制作蛋糕需要花费时间,启动新的线程,去制作蛋糕
20         new Thread(){
21
22             @Override
23             public void run() {
24                 //制作蛋糕的线程体
25                 RealData realData=new RealData(c, count);
26                 //将制作好的蛋糕塞入票据中
27                 futureData.setRealData(realData);
28             }
29
30         }.start();
31
32         System.out.println("蛋糕是否已经收到要求,给我一张取蛋糕的票据");
33
34         return futureData;
35
36     }
37 }

View Code

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

 1 package com.yeepay.sxf.thread9;
 2 /**
 3  * 模拟客户端
 4  * @author sxf
 5  *
 6  */
 7 public class Test {
 8
 9     public static void main(String[] args) {
10         Host host1=new Host();
11         Host host2=new Host();
12         //发送请求获取蛋糕票据
13         Data data=host1.request(2, "sxf");
14         Data data2=host2.request(3, "***");
15         //我可以去忙其他的事情
16         System.out.println("host1 Test.main(买菜做饭,到下午去取蛋糕)");
17
18         //取蛋糕
19         String cake=data.getContent();
20         String cake2=data2.getContent();
21         //吃蛋糕
22         System.out.println("Test.main(Host1)eate"+cake);
23         System.out.println("Test.main(Host2).eata"+cake2);
24     }
25
26 }

View Code

 

时间: 2024-09-25 07:40:53

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

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

Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResource(共享资源) 二:single threaded execution pattern模式什么时候使用--->多线程程序设计时--->数据可被多个线程访问的时候--->共享资源状态可能变化的时候--->需要确保数据安全性的时候 三:single threaded execution p

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

Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个字段的值都无法更改的类.        1.2:immutable也没有任何用来更改字段值的方法.        1.3:immutable参与者方法不需要设置synchronized 二:immutable pattern模式什么时候使用--->当实例产生后,状态不再变化时        2.1实例状

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

Read-Write Lock Pattern[读写]一:Read-Write Lock Pattern的参与者--->读写锁--->数据(共享资源)--->读线程--->写线程         二Read-Write Lock Pattern模式什么时候使用---> * 为了多线线程环境下保护数据安全,我们必须避免的冲突 * 一个线程读取,另一个线程写入的read-write conflick * 一个线程写入,另一个线程写入的write-write conflick *

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

Active Object[接收异步消息的对象] 一:Active Object的参与者--->客户端线程(发起某种操作请求处理)--->代理角色(工头)--->实际执行者(工人)--->主动对象接口(工人和工头)--->生产端线程(加工产品的线程)--->存放生产请求的队列(存放请求的队列)--->请求实例化(将方法的启动和执行分离的实例化包含)--->订单--->产品--->订单产品的共同接口        二:Active Object模式

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

Worker pattern[工作模式]一:Worker pattern的参与者--->Client(委托人线程)--->Channel(通道,里边有,存放请求的队列)--->Request(工作内容的包装)--->Worker(工人线程)        二:Worker pattern模式什么时候使用--->类似生产者消费者 三:Worker pattern思考 四进阶说明--->工作线程取出请求内容包装后,根据多态,不同的请求执行不同的业务方法   Request接

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

Thread-Specific-Storage[线程保管箱] 一:Thread-Specific Storage的参与者--->记录日志的线程(ClientThread)--->负责获取不同线程记录日志(Log)--->负责将日志写入文件的类(TsLog)         二:Thread-Specific Storage模式什么时候使用--->当每个线程必须有自己的独有信息时,可以将该信息放入线程保管箱ThreadLocal 三:Thread-Specific Storage思考

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

Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程(制造蛋糕的线程)--->消费者线程(吃掉蛋糕的线程)         二:Producer-Consumer pattern模式什么时候使用--->大量生产+大量消费的模式 三:Producer-Consumer pattern思考--->[生产消费者模式],肩负保护数据安全性使命的是通道

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

Balking[返回模式]timed[超时模式]一:balking pattern的参与者--->GuardedObject(被警戒的对象) --->该模式的角色:模拟修改警戒对象的线程,当警戒条件达到执行具体操作的线程,参与者(被警戒的参与者)        二:balking pattern模式什么时候使用--->不需要刻意去执行什么操作的时候(比如说自动保存)--->不想等待警戒条件成立时.(不让线程休息)--->警戒条件只有第一次成立时候.    三:balking

多线程程序设计学习(4)guarded suspension模式

Guarded Suspension[生产消费者模式] 一:guarded suspension的参与者--->guardedObject(被防卫)参与者                1.1该参与者拥有一个被防卫的方法(getRequest),如果警戒条件达成,则执行.警戒条件不达成,则线程进入wait set                1.2该参与者还拥有一个改变参与者状态的方法(putRequest).参与者的状态影响着警戒条件的是否达成. --->该模式的角色:生产端线程,消费端线