手写Future模式

C++委托与回调进阶:构建高性能、线程安全的事件驱动架构 在软件架构设计中,委托与回调是实现模块解耦和事件驱动编程的核心机制。其基本原理是通过函数指针或可调用对象,将特定操作延迟到运行时动态绑定,从而实现组件间的松耦合通信。从技术价值看,这种模式能显著提升代码的灵活性和可维护性,尤其适用于GUI框架、游戏引擎、网络库等需要处理异步事件和插件化扩展的场景。然而,在C++实践中,直接使用基础回调常面临对象生命周期管理、多线程安全及性能开销等挑战。本文聚焦于std::function与智能指针的协同、手写零开销委托模板以及线程安全信号槽系统等进阶方案,通过weak_pt 阅读详情

手写Future模式

根据前面我所说的Futrue模式,手写一个:

 

分别对应的Java代码,大家拿来参考:

package FutureTest;


//公共data数据接口
public abstract class Data {
     //方法作用 返回线程执行结果
    public abstract String getRequest();
}
package FutureTest;
//获取真实数据
public class RealData extends Data {
   
    private String requestData;
    public RealData(String requestData){
        System.out.println("正在使用data进行网络请求,data"+requestData+"开始");
        try {
            //模拟执行业务逻辑耗时时间
            Thread.sleep(3000);
        } catch (InterruptedException e) {        
            e.printStackTrace();
        }
        System.out.println("操作执行完毕...获取结果");
        //获取返回结果
        this.requestData="结果";
    }
    @Override
    public String getRequest() {
        
        return requestData;
    }
    
}
package FutureTest;

//当有线程想要获取RealData时候,程序会被阻塞。等到RealData被注入才会使用getReal()方法
public class FutureData extends Data{
    
    private boolean FLAG = false;
    private RealData realData;
    //读取data数据
    public synchronized void setRealData(RealData realData){
        //读取结果
         if (FLAG) {  //true 说明已经获取到结果了 如果获取到则直接返回结果
            
        }
         //如果flag是false,没有获取到数据,传递realData对象
         this.realData=realData;
         FLAG=true;  //获取到执行结果 改为true
         notify();//唤醒
    }
    
    
      @Override
    public synchronized  String getRequest() {
        while (!FLAG) {  //如果false 一直等待
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }  
        return realData.getRequest();
    }
    
     
       
}
package FutureTest;

public class FutureClient {
   //用户请求时候就会调用这个方法
    public Data request(String requestData){
    FutureData futureData = new FutureData();
          //开启一个线程
        new Thread(new Runnable() {
            public void run() {
            //会有阻塞  但是不影响到主线程
            RealData realData= new RealData("toov5"); //执行业务逻辑 然后返回结果
            futureData.setRealData(realData);  //把加载到的值(返回结果)设置给他
            
            }
        }).start(); 
          
        return futureData;  
    }
    
    
    
}

启动类主函数:

package FutureTest;

public class Main {
   public static void main(String[] args) {
      FutureClient futureClient = new FutureClient();
      Data request = futureClient.request("cone on");
      System.out.println("数据发送成功");  //主线程
      System.out.println("主线程继续干自己的");
      String result = request.getRequest();
      System.out.println("主线程去获取结果"+result);
} 
}

结果:

 

 大家对应着上一篇博客好好研究下,这个模式的应用场景还是蛮多的。代码挺有趣的。

当要获取资源的时候,data.getResult() ,如果资源没有准备好false;那么就会阻塞该线程。直到资源获取然后该线程被唤醒。

posted @ 2018-10-26 14:32 toov5 阅读( ...) 评论( ...) 编辑 收藏
ESP32S3新手避坑:用IDF5.0驱动GT911触摸屏,我踩过的三个雷都给你填平了 本文详细解析了在ESP32S3开发板上使用IDF5.0驱动GT911触摸屏时常见的三大问题:软重启失效、状态寄存器读取异常和初始化参数差异。通过逻辑分析和硬件调试工具,提供了针对性的解决方案和优化建议,帮助开发者高效完成触摸屏驱动开发。 阅读详情

相关推荐

别再死记硬背公式了!用Multisim仿真软件,5分钟搞懂三极管放大电路的工作原理

本文介绍如何利用Multisim仿真软件快速掌握三极管放大电路的工作原理,避免死记硬背公式。通过动态实验和参数调整,直观理解三极管的工作状态和放大效果,提升学习效率和实践能力。

weixin_30566063的博客 568

手写 Future 模式

Future 接口: public interface Future<T> { T get() throws InterruptedException; boolean isDone(); void Cancel(); boolean isCancel(); } FutureTask类: public class FutureTask...

ltx0720的博客 284

opencv的cmake报错

1、下载 ippicv_2021.8_win_intel64_20230330_general.zip、v0.1.2a.zip、opencv_videoio_ffmpeg.dll、opencv_videoio_ffmpeg_64.dll、ffmpeg_version.cmake。由于下载源在https://raw.githubusercontent.com,由于网络原因下载不顺畅,可以先找到文件下载到对应文件夹下,或者更改网络环境。ffmpeg_version.cmake文件,打开后显示如下, 另存即可。

nownow_的博客 1299

JAVA手写FutureTask,带你了解FutrueTask的基本原理,附代码。

JAVA手写FutureTask,带你了解FutrueTask的基本原理。

liuhongya328的博客 502

深入解析ST MC SDK(WorkBench)工程结构:从零搭建FOC电机控制项目

本文深入解析了ST MC SDK(WorkBench)工程结构,详细介绍了如何从零搭建FOC电机控制项目。通过ST MC SDK和WorkBench工具链,开发者可以快速配置电机类型、控制策略等参数,生成完整的FOC控制工程。文章还拆解了工程结构中的核心控制模块、HAL硬件抽象层、芯片系统初始化和电机控制算法库,并提供了无传感器FOC实战技巧和常见问题排查指南,帮助开发者高效掌握STM32F407ZGT6开发板上的FOC电机控制技术。

weixin_29173777的博客 412

别怕,“卷积”其实很简单

首先给大家讲一个关于卷积的小故事:小明是杭州某互联网大厂的员工,每天996十分辛苦,但小明最近爱上了打台球,经常不在工位。这天,小明的主管让小明改一个需求,小明却到楼下找产品部小丽打台球去了,被主管发现,他非常气愤,扇了小明一巴掌(注意,这就是输入信号,脉冲)。于是小明脸上会渐渐地(贱贱地)鼓起来一个包,小明的脸就是一个系统,而鼓起来的包就是小明的脸对巴掌的响应。好,这样就和信号系统建立起来意义对应的联系。

Machine Learning with Tutors 3181

《Java动手撸源码》手写实现Future设计模式

《Java动手撸源码》手写实现Future 文章目录《Java动手撸源码》手写实现Future前言一、UML设计二、代码实现2.1 FutureService2.3 FutureTask2.2 FutureServiceImpl三、代码测试总结 前言 最近经常遇见Future设计模式,比如在看Tomcat源码的HostConfig等XXXConfig类的deployDescriptors方法时;下面给出HostConfig的deployDescriptors源码: /** * Deploy

Turbo码先生 401

【OS】AUTOSAR OS系统调用产生Trap的过程详解

AUTOSAR OS系统调用产生Trap的过程详解

qq_36056498的博客 2438

【字体分享】来一波免费的漂亮英文手写体(上)

今天带给大家一波免费的漂亮英文手写体,下面的英文字体都是免费下载的哦,喜欢的话快抱走吧! 1、Rusted Orlando 2、Classical 3、Honey Butter Script Clean 4、Rockstar 5、Shelldon 6、Morristone 7、Cattalonia 8、Autumn Flower 需要字体可前往绿斗堂字体网下载,百度“绿斗堂字体网”...

hb19941122的博客 1万+

YOLO26全网首发:CVPR2026 MixerCSeg | DEGConv方向引导边缘门控,破解细长裂缝检测难题

DEGConv通过方向先验嵌入、边缘增强卷积和动态门控三大机制,针对性解决了YOLO在处理裂缝类细长、多方向、低对比度目标时的特征提取不足问题,显著提升了裂缝检测的精度与鲁棒性。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1034

57. SAP UI5 应用基于 OData 注解的 Smart Field 使用方法学习

所谓 SAP UI5 Smart Field,顾名思义,是一类比较`智能`的控件,这类控件同 SAP UI5 传统的控件不同,会根据 SAP UI5 应用程序连接的 OData 服务中元数据里提供的注解(`annotations`),在运行时动态生成底层的 SAP UI5 控件。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2771

java中的Future的设计模式 手写一个简易的Future

在并发编程中,可以通过Future对象来异步获取结果。 使用Thread或runnable接口都不能获取异步的执行结果,因为他们没有返回值。而通过实现Callable接口和Future就可以获取异步执行的结果,当异步执行结束后,返回结果将保存在Future中。使用Future就可以让我们暂时去处理其他的任务而无需一直等待结果,等异步任务执行完毕再返回其结果

weixin_46102873的博客 488

小波变换(深入浅出)

小波变换

weixin_46713695的博客 3万+

多线程手写Future模式

future模式 在进行耗时操作的时候,线程直接阻塞,我们需要优化这样的代码,让他再启动一个线程,不阻塞.可以执行下面的代码. 这个时候我们就用到了未来者模式 future设计类 只有一个方法 public interface Future<T> { T get() throws InterruptedException; } f...

aixian1133的博客 429

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

手写模拟Callable接口有返回值的Future模式,notify和wait的使用

总所周(java程序员)知,Runnable接口是没有返回值的,但是他的兄弟Callable有返回值。 贴代码吧。 /** * 模拟Callable接口的future模式 */ public class FutureModel { public static void main(String[] args) throws InterruptedException { Sys...

cassiel-卡希尔.cn 319

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【小家java】Java中Future模式衍生出来的高级应用---自己手写一个数据库连接池

说在前面 阅读本文之前,请确保你已经了解了Java中Future模式。若没有,ring出门左转,参考博文:【小家java】一个例子让就能你彻底理解Java的Future模式,Future类的设计思想 手动写一个数据库连接池 要求:该连接池能够复用数据库连接,并且能在高并发情况下正常工作 package test; import java.util.concurrent.Concu...

架构师:通透,才能写出好代码! 1037

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java Future模式详解:异步编程核心原理+实战代码+JDK内置实现

摘要:本文深入解析Java Future模式,通过对比传统同步流程和Future异步流程,展示如何利用"异步执行+结果延迟获取"提升系统吞吐量。核心内容包括:1) Future模式概念及类比场景;2) 手写实现关键组件(FutureData、RealData、Client);3) JDK内置Future优化方案。文章通过流程图、代码示例和角色说明,完整呈现Future模式的设计思想与实战应用,帮助开发者掌握多线程编程中的高效异步处理技巧。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1512

Pin 的痛苦:从手写 Future 理解 async Rust 的底层规则

这篇文章从一个最简单的例子开始:同步 Rust 里打印 Hello,sleep 500ms,再打印 Goodbye,很直观。换到 async Rust,如果直接在 async 函数中调用,虽然单任务下看起来没问题,但它会阻塞 executor。默认多线程 Tokio runtime 可能掩盖这个问题,而单线程runtime 会清楚暴露:两个任务会串行执行。正确做法是使用,让 sleep 变成一个 Future,而不是阻塞线程。接着,文章手写了一个最小 Future。Future只是 trait,有。

techdashen的博客 370

FUTURE POLICE模型Dify平台集成教程:快速构建语音处理AI Agent

本文介绍了如何在星图GPU平台上自动化部署🛡️ FUTURE POLICE: 高精度语音解构镜像,并快速集成至Dify平台以构建语音处理AI Agent。通过该方案,用户无需复杂编码即可创建能听懂指令、分析语义并生成结构化文本报告的智能语音助手,显著降低AI应用开发门槛。

weixin_42514540的博客 227

Futures Nostalgia:从 hyper 老派写法看懂 async Rust、Tower 与 Backpressure

文章结尾有人问作者:你现在最喜欢的 Rust HTTP framework 是什么?作者回答:axum。原因很简单:axum 让他大多数时候不必关心 hyperisms / towerisms,但当他想深入时,又能接入 hyper/tower 生态。平时用高层 API,快速写业务。需要控制时,可以往下钻。底层仍然是清晰、组合良好的 tower/hyper。一个好框架不应该把底层完全封死。它应该让常见路径简单,也给高级用户留逃生通道。

techdashen的博客 343

Rust 异步运行时深度剖析:从 Executor 调度到 Waker 机制

Waker 是连接 Future 和 Executor 的关键。当异步操作(如 I/O)完成时,底层会调用wake()通知执行器重新调度任务。// 将任务重新加入队列深度理解wake()消费Arc<Self>只借用,后者更高效在多线程场景下,需要确保task_queue的线程安全Waker 可以被克隆多次,每次克隆都增加引用计数Future 的惰性本质:不主动执行,必须被 pollExecutor 的职责:调度、轮询、响应唤醒Waker 的艺术:连接异步操作和执行器的桥梁。

2301_76618579的博客 1988

Poll 机制与状态机转换:Rust 异步引擎的解剖与实战

Rust异步编程核心机制探析 本文深入剖析Rust异步编程中最核心的Poll机制,揭示其底层原理和实现模式。主要内容包括: Poll语义解析:详细解释Rust中Poll的四种关键承诺(幂等性、不移动、Waker契约、Ready即终点)及其违反后果 底层执行原理:通过CPU指令级分析,展示poll()调用如何转换为状态机函数的尾调用,实现零栈开销的高效执行 手写状态机实践:以计时器为例,演示如何构建可组合、零拷贝的自定义Future实现 调试工具开发:介绍用于追踪Future生命周期的可视化调试器实现方案 文

2401_84536007的博客 972

用 gopoolx 把 Go 并发“写成工程,而不是写成故事”

Go并发编程中,goroutine虽然简单易用,但在生产环境中常面临内存泄漏、错误处理复杂、panic恢复困难等问题。gopoolx是一个工程级的Goroutine任务池,提供了并发控制、自动重试、错误收集、panic恢复等开箱即用的功能。支持Future泛型获取任务结果,并提供非阻塞提交模式防止系统过载。通过固化最佳实践,gopoolx帮助开发者避免手写协程池的常见陷阱,既可直接使用也可作为扩展基础。项目地址:https://github.com/hyin49954/gopoolx

php123456er的博客 660

Future模式

Java多线程中,Callable/Future接口是一个非常重要的知识点,我们都知道无论继承Thread类,还是实现Runnable接口,在线程任务执行结束后,都无法获取执行结果,所以Java中提供了Callable、Future接口,Callable的call方法用来执行任务,产出结果,Future的get方法用来获取线程执行的结果。它们的底层使用的其实是Future模式。比如,现在主线程发送...

FutureFlyme的博客 445

Callable的Future模式

线程实现方式: 1.继承Thread类 2.实现Runnable接口 3.线程池 4.Callable 无论使用继承Thread类还是实现Runnable接口,还是使用线程池都没有办法解决2个问题 1.线程执行没有返回值结果 2.线程执行没有办法抛出异常,只能自己通过try-catch解决 Callable和Runnable类似,在JUC包下,主要区别在于Callable中的call方法可以带返回...

qq_43868329的博客 161

netty的Future异步回调难理解?手写个带回调异步框架就懂了

netty是一个经典的网络框架,提供了基于NIO、AIO的方式来完成少量线程支持海量用户请求连接的模型。netty里面充斥了大量的非阻塞回调模式,主要是靠Future/Promise异步...

开涛的博客 738
上一篇: 异步模式模式Future(结合Callable可以获取线程返回结果)
下一篇: Java锁机制-重入锁
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值