Future初次使用理解

本文介绍了一种异步代理模式的设计思路及其实现方法。通过在客户端请求时立即返回代理对象,并在后台线程中构建真实对象,实现了高效利用等待时间的目的。文章提供了完整的Java代码示例,展示了如何在代理对象中同步等待真实数据的构建。

             当客户端执行方法时,立即返回一个代理对象,此时代理对象没有数据,与此同时开启一个线程去构造真实对象并把真实对象替换掉代理对象(使用set方法)。所以就会出现,客户端收到代理对象之后以为执行完了然后执行下一步,当需要调用这个代理对象的方法时,方法中返回的是构造完毕的真实对象的数据;

    利用其他方法的执行时间异步将真实对象构建出来。提高效率。

    在代理对象中的set方法中标记真实对象的构建状态,如果没有调用set方法构建状态默认为false,调用代理对象getresult方法时就无限等待。挡调用set方法时,标记代理对象构建成功,调用notifyAll唤醒等待,这样getResult方法即可返回真是对象数据。

 

代码摘自 https://blog.youkuaiyun.com/lmdcszh/article/details/39696357

(1)Main函数:

 

[java]  view plain  copy
 
  1. <span style="font-size:18px;">package tgb;  
  2.   
  3. public class Main {  
  4.       
  5.     public static void main(String[] args){  
  6.         Client client = new Client();  
  7.         //理解返回一个FutureData  
  8.         Data data = client.request("name");  
  9.         System.out.println("请求完毕!");  
  10.           
  11.         try{  
  12.               
  13.             //处理其他业务  
  14.             //这个过程中,真是数据RealData组装完成,重复利用等待时间  
  15.             Thread.sleep(2000);           
  16.               
  17.         }catch (Exception e){  
  18.               
  19.         }  
  20.           
  21.         //真实数据  
  22.         System.out.println("数据 = "+ data.getResult());  
  23.           
  24.           
  25.     }  
  26.       
  27. }  
  28. </span>  

 

(2)Client的实现:

 

[java]  view plain  copy
 
  1. <span style="font-size:18px;">package tgb;  
  2.   
  3. public class Client {  
  4.   
  5.     public Data request(final String queryStr){  
  6.         final FutureData future = new FutureData();  
  7.         //开启一个新的线程来构造真实数据  
  8.         new Thread(){  
  9.             public void run(){  
  10.                 RealData realData = new RealData(queryStr);  
  11.                 future.setRealData(realData);           }  
  12.         }.start();  
  13.         return future;  
  14.     }  
  15. }  
  16. </span>  

 


(3)Data的实现:

 

[java]  view plain  copy
 
  1. <span style="font-size:18px;">package tgb;  
  2.   
  3. public interface Data {  
  4.   
  5.     public  String getResult();  
  6. }  
  7. </span>  

 


(4)FutureData:

 

[java]  view plain  copy
 
  1. <span style="font-size:18px;">package tgb;  
  2.   
  3. /** 
  4.  * 是对RealData的一个包装 
  5.  * @author limin 
  6.  * 
  7.  */  
  8. public class FutureData implements Data {  
  9.   
  10.     protected RealData realData =null;  
  11.     protected boolean isReady = false;  
  12.     public synchronized void setRealData(RealData realData){  
  13.         if(isReady){  
  14.             return;  
  15.         }  
  16.         this.realData=realData;  
  17.         isReady=true;  
  18.         notifyAll();  
  19.           
  20.     }  
  21.       
  22.     @Override  
  23.     public  synchronized  String getResult() {  
  24.         while(!isReady){  
  25.             try{  
  26.                 wait();  
  27.             }catch (Exception e){  
  28.                   
  29.             }  
  30.         }  
  31.         return realData.result;  
  32.     }  
  33.   
  34. }  
  35. </span>  

 


(5)RealData实现:

 

[java]  view plain  copy
 
    1. <span style="font-size:18px;">package tgb;  
    2.   
    3. public class RealData implements Data {  
    4.     protected  String  result;  
    5.       
    6.     public RealData(String para){  
    7.          //构造比较慢  
    8.         StringBuffer sb= new StringBuffer();  
    9.         for(int i=0;i<10;i++){  
    10.             sb.append(para);  
    11.             try{  
    12.                 Thread.sleep(1000);  
    13.             }catch(Exception e){  
    14.                   
    15.             }  
    16.             result= sb.toString();  
    17.         }  
    18.     }  
    19.       
    20.       
    21.       
    22.     @Override  
    23.     public String getResult() {  
    24.   
    25.         return result;  
    26.     }  
    27.   
    28. }  
    29. </span>  

 

转载于:https://www.cnblogs.com/CHWLearningNotes/p/9084282.html

<think>好的,用户想了解Rust异步编程的学习和理解。首先,我需要回忆Rust异步编程的基本概念和核心机制。Rust的异步编程主要围绕async/await语法、Future trait、执行器(Executor)、反应器(Reactor)等部分展开。用户可能已经有一定的同步编程经验,现在想转向异步以提高性能,特别是在处理高并发、I/O密集型任务时。 接下来,用户可能的疑问点包括:为什么Rust选择基于生成器的异步模型?Future在Rust中是如何工作的?async/await背后的机制是什么?执行器和反应器各自扮演什么角色?还有常见的运行时如tokio和async-std的区别和使用场景。 需要分步骤解释,从基本概念入手,逐步深入。首先介绍异步编程解决的问题,然后讲解Future trait,接着是async/await语法糖,再讨论执行器和反应器如何协作,最后提到生态中的运行时库。同时要提醒常见的陷阱,比如阻塞操作在异步任务中的影响,以及Pin和Unpin的作用。 可能用户的实际需求是在项目中高效处理大量网络请求或文件I/O,所以需要强调Rust异步在性能上的优势,比如零成本抽象和避免全局运行时开销。此外,应该提供简单的代码示例,展示如何定义异步函数和使用.await,以及选择运行时库的基本方法。 还要注意用户的潜在问题,比如错误处理、任务取消、跨线程调度等高级话题,但初次学习可能不需要深入这些细节,点到为止即可。最后,总结学习路径,推荐官方文档和社区资源,帮助用户继续深入学习。</think>以下是Rust异步编程的核心概念分步解析(建议结合代码实践理解): 一、同步与异步的本质区别 同步模型:线程阻塞等待I/O完成 → 高并发时线程切换开销大 异步模型:单线程内多任务交替执行 → 通过状态机实现非阻塞 二、Rust异步核心三要素 1. Future trait(异步计算抽象) ```rust pub trait Future { type Output; fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>; } ``` - 每个async块编译后生成实现Future的状态机 - poll方法驱动状态机推进(非递归调用) 2. 执行器(Executor) - 线程池调度管理Future任务 - 典型实现:tokio::runtime、async-std::task 3. 反应器(Reactor) - 事件循环监控I/O就绪状态 - 通过epoll/kqueue/IOCP等系统调用实现 三、async/await工作流程 1. 定义异步函数 ```rust async fn fetch_data() -> Result<String, io::Error> { // 模拟异步操作 tokio::time::sleep(Duration::from_secs(1)).await; Ok("Data".to_owned()) } ``` 2. 执行异步任务 ```rust #[tokio::main] async fn main() { let data = fetch_data().await.unwrap(); println!("{}", data); } ``` 四、运行时选择策略 | 特性 | tokio | async-std | |-------------|------------------|-------------------| | 设计目标 | 高性能网络应用 | 更接近标准库体验 | | 定时器精度 | 毫秒级 | 秒级 | | 社区生态 | 丰富插件生态 | 逐渐增长 | | 适用场景 | 复杂网络服务 | CLI工具/简单服务 | 五、关键注意事项 1. 避免阻塞:同步代码需用`spawn_blocking`隔离 2. 生命周期:`.await`可能导致引用失效,需用`Arc`共享 3. Pin约束:自引用结构必须固定内存地址 4. 取消传播:`select!`宏可处理多任务竞争 学习路线建议: 1. 掌握Future基础 → 2. 理解executor/reactor协作 → 3. 熟悉常见运行时API → 4. 实践典型并发模式(如channel、semaphore)→ 5. 研究高级优化技巧(如零拷贝IO) 推荐实践项目: - 异步Web爬虫 - TCP聊天服务器 - 并行文件处理器 - 自定义Future实现 官方资源: - 《Rust异步编程指南》(官方文档) - tokio官网教程(含丰富示例) - async-book中文版(社区翻译)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值