多线程之Future模式

等保2.0下可信验证的动态实现与合规实践 本文深入解读等保2.0标准中的“可信验证”要求,并重点探讨其动态实现与合规实践。文章阐述了从可信根、信任链到动态验证的核心概念,拆解了不同安全等级的实施差异,并提供了从硬件选型、软件赋能到平台集成的四步落地指南。通过行业案例与避坑心得,为构建覆盖计算环境、区域边界、通信网络和安全管理中心的全链条可信防御体系提供了实用参考。 阅读详情

概述:

Futrue模式:对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果是再取真实的结果。

主要角色:

  • Client:发出请求
  • Server:返回Data对象,立即返回FutureData,并开启Thread线程装配RealData
  • Data:返回数据的接口
  • FutureData:Futrue数据,是一个虚拟的数据,需要装配RealData
  • RealData:真实数据,构造比较慢

时序图:

这里写图片描述

演示代码:

public interface Data {
    String getRequest();
}
public class RealData implements Data {
    private String result;

    public RealData(String request) {
        System.out.println("根据" + request + "进行查询..,要花很久时间");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("操作完毕,获取结果");
        result = "查询结果";
    }

    public String getRequest() {
        return result;
    }
}
public class FutureData implements Data {

    private RealData realData;

    private boolean isReady = false;

    public synchronized String getRequest() {

        while (!isReady) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return this.realData.getRequest();
    }

    public synchronized void setRealData(RealData realData) {
        if (isReady) {
            return;
        }
        this.realData = realData;
        isReady = true;
        notify();
    }
}
public class FutureClient {
    public Data request(final String request) {

        final FutureData futureData = new FutureData();
        // 开启线程执行操作
        new Thread(new Runnable() {
            public void run() {
                RealData realData = new RealData(request);
                futureData.setRealData(realData);
            }
        }).start();

        return futureData;
    }
}
public class Main {

    public static void main(String[] args) {
        FutureClient fClient = new FutureClient();

        Data data = fClient.request("hello,world");

        System.out.println("请求发送成功...");
        System.out.println("干其他的事情...");

        String result = data.getRequest();

        System.out.println(result);
    }
}

JDK实现:

import java.util.concurrent.Callable;

public class RealData implements Callable<String> {
    private String param;

    public RealData(String param) {
        this.param = param;
    }

    // 处理业务逻辑
    public String call() throws Exception {
        //利用sleep来表示任务处理
        Thread.sleep(2000);

        return "这是根据"+param+"处理后返回的结果";
    }
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class Main {

    public static void main(String[] args) throws Exception {
        Long start = System.currentTimeMillis();

        FutureTask<String> futureTask = new FutureTask<>(new RealData("hello,world"));
        ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(1);
        newFixedThreadPool.submit(futureTask);

        // 表示主线程正在处理其他逻辑,或者业务
        Thread.sleep(1000);

        System.out.println("子线程处理完成后的结果-->" + futureTask.get());

        Long end = System.currentTimeMillis();

        Long useTime = end - start;

        System.out.println("程序运行了-->" + useTime + "毫秒");
    }
}

补充

1、并发编程时,一般使用Runnable,然后扔给线程池就完事,这种情况下不需要线程的结果。 所以run的返回值是void类型。

2、如果是一个多线程协作程序,比如菲波拉切数列:1,1,2,3,5,8…使用多线程来计算。 但后者需要前者的结果,就需要用Callable接口了。

3、Callable用法和Runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以任意指定。

4、线程是属于异步计算模型,所以你不可能直接从别的线程中得到函数返回值。这时候,Future就出场了。Futrue可以监视目标线程调用call的情况,当你调用Future的get()方法以获得结果时,当前线程就开始阻塞,直接call方法结束返回结果。


参考:
《高阶多线程设计模式:Future》
《多线程之Future模式》
《java多线程之Future模式使用》

理想汽车智驾方案介绍 4 World model + 强化学习重建自动驾驶交互环境 本帖将以 DrivingSphere 为例来解析这个过程。 阅读详情

相关推荐

实战解析:从Innovus到Calibre的LVS错误排查全流程

本文详细解析了从Innovus到Calibre的LVS错误排查全流程,涵盖物理验证关键步骤与工具链协同。通过实战案例分享,重点解决器件不匹配、连接性错误等常见问题,并提供GDS导出规范、网表修正策略等实用技巧,帮助工程师高效完成芯片设计物理验证。

9o8p7i6u5y的博客 1034

Future 用法详解

Future 用法详解 前言 为什么出现Future机制 常见的两种创建线程的方式。一种是直接继承Thread,另外一种就是实现Runnable接口。 这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。 Future模式的核心思想是能够让主线程将原来需要同步等待的这段时间用来做其他的事情。 因为可以异步获得执行结果,所以不用一直同步等待去获得执行结果。 Future 用法详解 用法很

. 2897

《YOLOv8-seg改进》专栏指导书册 &手把手创新教程

学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研;1)手把手教你如何训练YOLOv8-seg;2)模型创新,提升分割性能;3)独家自研模块助力分割;

会AI的学姐 3810

java中使用CompletableFuture实现异步编程

介绍CompletableFuture常用的api方法,使用CompletableFuture实现异步编程

dream_xin2013的专栏 251

恒玄BES调试笔记-BES2500如何Dump Anc Audio数据

从YP的4M flash改HP3的2M flash只需要改: 原工程:target.mk的export FLASH_SIZE ?= 0x200000和common.mk里的KBUILD_CPPFLAGS += -DNEW_IMAGE_FLASH_OFFSET=0x100000 OTA工程:target.mk的NEW_IMAGE_FLASH_OFFSET ?= 0x100000和FLASH_SIZE ?= 0x200000 ...

leezs的博客 1672

【AI智能体】Codex AI 辅助编程高级技能实战操作详解

Codex AI 辅助编程高级技能实战操作详解

congge 6756

多线程Future模式使用

序 上次分享了多线程与自动任务的风花雪月悲惨结局,今天借此继续分享下多线程带返回结果的基本讨论与实现。 一、使用场景 一个业务方法可能执行时间很长,而我们也不急着摇返回结果,那么就可以用多线程去开启一个子线程执行这个业务方法,同时,子线程可以返回这个业务方法的返回结果,那这是什么模式呢? 二、关于Future 1.什么是Future模式 Future模式 是多线程开发中非常常见的一种设计模式。它的核心思想是异步调用。当我们需要调用一个函数方法时。如果这个函数执行很慢,那么我们就要进行等待。但有时候,我们可

zwrlj527的专栏 4956

基于STM32设计的温室大棚种植监测系统(onenet+GPRS通信)

当前所设计的温室大棚种植监测系统基于STM32单片机开发,它能够对温室大棚内的温度、湿度、光照强度、土壤湿度、二氧化碳含量等环境参数进行实时监测,并将数据传输至OneNET云平台,实现了远程监测和管理。该系统具有体积小、功耗低、可靠性高等特点,适合在温室大棚等场合使用。

7870

学习多线程中的 Future 模式一篇文章就够了 !!!

文章目录一、Future 模式二、Future模式的主要角色三、Future模式的简单实现四、JDK中的Future模式五、Guava对Future模式的支持 一、Future 模式 Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。 当我们需要调用一个函数方法时,如果这个函数执行得很慢,那么我们就要进行等待。 但有时候,我们可能并不急着要结果。因此,我们可以让被调者立即返回,让它在后台慢慢处理这个请求。对于调用者来说,则可以先处理一些其他任务,在真正需要数据的场合再去尝试获得需

南淮北安的博客 6612

Simulink开发项1000例实战专栏--实例52:基于Simulink开发一个超导磁储能控制系统,实现对SMES系统的精确控制和优化

需求分析超导磁储能系统(Superconducting Magnetic Energy Storage, SMES)是一种利用超导线圈储存和释放电能的高效储能技术。SMES系统具有响应速度快、能量密度高、循环寿命长等优点,广泛应用于电力系统的调峰填谷、频率调节、电压稳定以及紧急备用电源等领域。本项目将基于Simulink平台,开发一个完整的超导磁储能控制系统,实现对SMES系统的精确控制和优化。我们将详细讲解如何设计和实现该系统,并结合实际应用案例进行说明。

xiaoheshang_123的博客 236

【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)

在游戏发展史上,有些游戏以其简单而耐玩的特性,深深地烙印在了玩家的记忆中。《黄金矿工》就是其中之一,它曾经在4399等游戏平台上掀起了一股游戏热潮。这款游戏不仅给无数玩家带来了欢乐,还让他们体验到了挖掘金矿的刺激与乐趣。在这个项目中,我们将花费半天的时间,利用Unity引擎,重新打造这款经典小游戏。通过复刻《黄金矿工》,我们不仅是在向童年的回忆致敬,更是在挖掘游戏设计的精髓。在这个过程中,我们将学习如何实现游戏的核心玩法,设计简洁而有效的游戏机制。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2900

【线程池】线程任务结果Future、FutureTask、CompletableFuture

我们在Java线程池ThreadPoolExecutor使用详解中利用execute(Runnable r)方法来异步执行任务,但是有一个缺点,就是无法执行带有返回值的任务。总的来说Future模式的思想就是在子线程进行执行的时候,主线程不阻塞继续执行。等到主线程需要子线程的结果的时候再去获取子线程的结果(此时子线程没有执行完成的话就会阻塞直至执行完成)。主线程还可以根据一定的业务逻辑去判断是否要取消执行子线程,还可以设置一个超时时间。

weixin_44823875的博客 5200

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

多线程——11Future模式

Future产生起源 在以前我们写的多线程执行任务是拿不到多线程的执行结果的,除非我们使用前面咱们说的观察者模式来获取; 在这里我们提供能外一种方式来获取线程的执行结果 三个重要角色 Future他是保存任务调用之后的结果,在他里面需要提供get方法让主线程去拿到结果, 也要提供设置方法让直行线程去设置结果; 如果执行未完成就调用泛型返回值的wait方法阻塞主线程,当执行线程调用了设置方法时...

sui_feng_piao_guo的博客 2320

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

多线程Future模式

Future模式:对于多线程来说,如果线程A要等待线程B到结果,那么线程A没有必要等待线程B,直到B有结果,可以先拿到一个未来到Future,等B有结果时再取真实值。 核心:去除了主函数等待时间,并使得原本需要等待的时间段可以用于处理其他的业务逻辑。 在多线程中经常举的一个例子就是:网络图片的下载,刚开始是通过模糊的图片来代替最后的图片,等下载图片的线程下载完图片后在替换。而在这个过程中可以做...

小尾寒羊的博客 721

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

多线程设计模式 - Future模式

一起来看看多线程设计模式中的Future模式吧~概述Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。这类似我们日常生活中的在线购物流程,带在...

飘渺Jam的博客 2310

Java多线程Future模式

Java多线程Future模式有些类似于Ajax的异步请求Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 假设服务器的处理某个业务,该业务可以分成AB两个过程,并且AB两个过程之间不需要彼此的返回结果 A过程需要1秒钟,B过程需要2秒钟,主线程其他操作2秒钟按照正常编写,程序大概需要执行5秒如果按照Future模式只需要执行...

anzhuod075808的博客 214

Java多线程 - Future模式

class FutureTask { private volatile int state; private static final int NEW = 0; private static final int COMPLETING = 1; private static final int NORMAL = 2; pri...

robinson_911的专栏 370

java多线程之Future模式 应用

1. Future的应用场景 在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承thread类还是实现runnable接口,都无法保证获取到之前的执行结果。通过实现Callback接口,并用Future可以来接收多线程的执行结果。 Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便在任务执行成功或失败后作出相应的操作。 举个例子...

漏墨小子的博客 423

Future 模式实现java 多线程异步调用

在多线程交互的中2,经常有一个线程需要得到另个一线程的计算结果,我们常用的是Future异步模式来加以解决。 Future顾名思意,有点像期货市场的“期权”,是“对未来的一种凭证”,例如当我们买了某个房地产开发商的期房,交钱之后,开发商会给我们一个凭证 (期权),这个凭证告诉我们等明年某个时候拿这个凭证就可以拿到我们所需要的房子,但是现在房子还没建好。市场上之所以有“期货”,也正由于有这种需求...

wzhw2008的专栏 645

Java多线程编程中Future模式的详解

Java多线程编程中,常用的多线程设计模式包括:Future模式、Master-Worker模式、Guarded Suspeionsion模式、不变模式和生产者-消费者模式等。这篇文章主要讲述Future模式,关于其他多线程设计模式的地址如下: 关于Future模式的详解: 关于Master-Worker模式的详解: 关于Guarded Suspeionsion模式的详解: 关于不变模式的

大饼辉的专栏 1万+

超实用的多线程future模式实例

编码过程中经常会遇到多线程的协同合作场景,也就是说某个线程依赖于另一个线程的返回,而大家都知道线程的run方法是没有返回值的,如何解决线程返回的问题呢,当然可以通过线程的join方法等待,然后通过调用线程的成员变量来获取结果(前一批文章中有实例),但是更好的解决办法是future模式。以下是实例: 1、定义作业线程: package design.pattern.future; import java.util.Random; import java.util.concurrent.Callable; i

Bruce Shen 的博客 611

多线程编程模式之Future模式

文章目录Future模式Future介绍Future使用场景Future示例代码分析Future模式的理解 Future模式 Future介绍 Future的意思是未来。如果某个方法需要很长时间来运行,那么调用者就没有必要一直等待结果,相反,它可以先获得一个关于结果的凭证,然后等一段时间后再根据凭证来索取结果。当然,Future模式和Thread Per Message很类似,但它们的区别也很明显...

博采众长,自成一派; 425

java future 设计模式_高阶多线程设计模式:Future,不看你会后悔

说到多线程的future,百度 多线程 future,网上也有各式各样的例子,写的比我还要好,但是实在是这个模式或者说例子以及实用性太大了,我不得不拿出来讲,甚至在实际生产环境中也是可以用的.我呢,也是拿出网上的例子详细的讲一遍~~看下面的图↓↓↓↓↓传统下单流程.jpg如上图,传统的订单下单流程,首先减商品库存,然后生成订单,然后生成订单详情,再通知短信等等,全部逻辑程序都是串行执行的.假如我们...

weixin_32980943的博客 180

多线程(10) — Future模式

  Future模式是多线程开发中常用常见的一种设计模式,它的核心思想是异步调用。在调用一个函数方法时候,如果函数执行很慢,我们就要进行等待,但这时我们可能不着急要结果,因此我们可以让被调者立即返回,让它在后台慢慢处理这个请求,对于调用者来说可以先处理一些其他事物,在真正需要数据的场合再去尝试获得需要的数据。对于Future模式来说,虽然它无法立即给出你需要的数据,但是它们返回一个契约给...

diandao9404的博客 248

Java多线程技术研究(四)-Callable,Future/FutureTask,及Future设计模式

本篇博客Java多线程中另一块重要的内容:Callable和Future。在Java多线程技术研究(一) 中,Callable和Runnable一样,都是实现多线程的一种一种方法,但是Runnable不会返回结果,并且无法抛出带返回结果的异常,而Callable功能更加强大一些,线程执行结束后可以返回结果。这个结果可以通过Future拿到该线程的返回值。 考虑这样一种场景: 网上购物,提交订单后

guweiyu_thinker的博客 598
上一篇: 多线程基础之wait和notify
下一篇: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined(tomcat error)
章 鱼
博客等级 码龄10年 203粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值