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

简介: Future pattern[订单取货模式]一:Future pattern的参与者--->Client(客户需求)--->Host(蛋糕门店)--->Data(票据和蛋糕的接口)--->Future(蛋糕票据)--->ReaData(制作蛋糕过程)       二: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

 

相关文章
|
缓存 Java 调度
Java并发编程:深入解析线程池与Future任务
【7月更文挑战第9天】线程池和Future任务是Java并发编程中非常重要的概念。线程池通过重用线程减少了线程创建和销毁的开销,提高了资源利用率。而Future接口则提供了检查异步任务状态和获取任务结果的能力,使得异步编程更加灵活和强大。掌握这些概念,将有助于我们编写出更高效、更可靠的并发程序。
|
12月前
|
Java 调度 开发者
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
304 10
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
1185 6
【Java学习】多线程&JUC万字超详解
|
NoSQL Redis
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
478 0
|
调度 Python
Python多线程学习优质方法分享
Python多线程学习优质方法分享
112 0
|
安全 API C++
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
741 0
|
3月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
195 6
|
6月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
351 83
|
3月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
390 0
|
8月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
316 0

热门文章

最新文章