首页 > 其他分享 >第五章 并发基础中的Future异步回调模式

第五章 并发基础中的Future异步回调模式

时间:2024-05-27 22:14:54浏览次数:20  
标签:异步 烧水 执行 阻塞 并发 Future 线程 回调

案例:为了提升泡茶效率。下面分别是用阻塞模式和异步回调模式来实现其中的异步泡茶流程。

为了异步执行整个泡茶流程,分别设计三条线程:主线程、清洗线程、烧水线程。

(1)主线程(MainThread)的工作是:启动清洗线程、启动烧水线程,等清洗、烧水完成后,泡茶喝。
(2)清洗线程(WashThread)的工作是:洗茶壶、洗茶杯。
(3)烧水线程(HotWarterThread)的工作是:洗好水壶,灌上凉水,放在火上,一直等水烧开。

 1.join异步阻塞

主线程通过分别调用烧水线程和清洗线程的join方法,等待烧水线程和清洗线程执行完成,然后执行自己的泡茶操作。

join有一个问题:被合并的线程没有返回值。例如,在烧水的实例中,如果烧水线程的执行结束,main线程是无法知道结果的。同样, 清洗线程的执行结果,main线程也是无法知道的。形象地说,join线程合并就是一像一个闷葫芦,只能发起合并线程,不能取到执行结果。如果需要获得异步线程的执行结果, 怎么办呢?可以使用Java的FutureTask系列类。

 

2.FutureTask类实现异步泡茶喝案例

要让线程有返回值,需要线程实现的接口由Runnable改为Callable<T>,并且在call方法中返回了异步线程的执行结果,这样主线程就能收到烧水线程和清洗线程的返回值。

因为通过FutureTask类的get方法,获取异步结果时,主线程也会被阻塞的。这一点,FutureTas和join也是一样的,它们俩都是异步阻塞模式。异步阻塞的效率往往是比较低的被阻塞的主线程不能干任何事情,唯一能干的,就是在傻傻地等待。原生Java API,除了阻塞模式的获取结果外,并没有实现非阻塞的异步结果获取方法。如
果需要用到获取异步的结果,则需要引、一些额外的框架,这里首先介绍谷歌公司的Guava框架。

3.GUuava的异步回调

 

Guava异步回调的流程如下:
第1步:实现Java的Callable接口,创建异步执行逻辑。还有一种情况,如果不需要返回值异步执行逻辑也可以实现Java的Runnable接口。
第2步:创建Guava线程池。
第3步:将第1步创建的Callable/Runnable异步执行逻辑的实例,通过submit提交到Guava线程池,从而获取ListenableFuture异步任务实例。
第4步:创建 FutureCallback 回调实例,通过 Futures.addCallback 将回调实例绑定到ListenableFuture异步任务上。
完成以上四步,当Callable/Runnable异步执行逻辑完成后,就会回调异步回调实例FutureCallback的回调方法onSuccess/onFailure。

 

 

4.Netty的异步回调模式

 

标签:异步,烧水,执行,阻塞,并发,Future,线程,回调
From: https://www.cnblogs.com/Yi-ling/p/18216421

相关文章

  • Angular多环境打包项目并发布到nginx运行
    1:官网下载稳定版本Nginx1.26.0  2:先跑起来看是否异常,如果没有跑起来我们可以检查分析nginx的log日志3:项目路径如下: 4:前端多环境简单测试配置 5:路由配置简单测试数据constroutes:Routes=[{path:'',redirectTo:'/home',pathMatch:"full"},{......
  • 全面详解Java并发编程:从基础到高级应用
    全面详解Java并发编程:从基础到高级应用Java并发编程是Java开发中一个非常重要的领域,涉及多线程编程技术,用于提高程序的性能和响应能力。并发编程在多核处理器上特别有用,因为它可以同时执行多个任务,从而提高应用程序的效率。以下是对Java并发编程的详细讲解,涵盖基本概念、线......
  • 生产环境中秒杀接口并发量剧增与负载优化策略探讨
    ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ ......
  • Python - 并发模型
    自建进程池#示例19-12sequential.py:对一个小型数据集做指数检测(顺序执行版)"""sequential.py:CPU密集型工作的舒徐执行版,多线程版和多进程版的比较基准"""fromtimeimportperf_counterfromtypingimportNamedTuplefromprimesimportis_prime,NUMBERSclassR......
  • MySQL——2、并发事务所带来的问题是什么?怎样去解决?MySQL的默认隔离级别是什么
    一、并发事务所带来的问题1、脏读:就是一个事务对数据进行查询操作时而另一个事物在修改这条数据但未提交,这时进行查询操作的事务就会读取到未提交的数据也就是脏数据2、不可重复读:事务A查询一次数据接着事务B修改了数据并且已提交事务A继续执行操作查询数据读到了不一样的数......
  • 【Python并发编程指南】多线程、多进程与异步编程比较与选择
    ......
  • C# 混淆加密大师1.1.0更新, 新增资源文件加密, 防虚拟机, 异步混淆等新功能
    C#混淆加密大师是一款强大的工具,专为保护C#开发的dll和exe文件而设计,适用于各种应用程序,包括Winform、WPF、Unity游戏以及控制台程序。它支持从.NetFramework2.0到.NetFramework4.x,以及.NETCore2.0直至最新的.NET8版本。C#混淆加密大师不仅提供代码加密混淆功能,还能对EXE文......
  • 同步通信与异步通信
    异步通信(AsynchronousCommunication)和同步通信(SynchronousCommunication)是计算机网络和计算机系统中两种不同的数据传输方式。它们的主要区别在于数据传输的控制方式和时间关系。同步通信(SynchronousCommunication)同步通信是指数据传输过程中,发送方和接收方的时钟是同步的,即......
  • Netty_Redis_Zookeeper高并发实战-读书笔记
    转载自:https://www.cnblogs.com/leihongzhi/p/17381156.html 第1章    高并发时代的必备技能1.nettyNetty是JBOSS提供的一个Java开源框架,基于NIO的客户端/服务器编程框架,能够快速开发高并发、高可用、高可靠的网络服务器程序,也能开发高可用、高可靠的客户端程序。NIO是......
  • [AIGC] CompletableFuture如何实现任务链式调用?
    Java中的CompletableFuture提供了多种方法来支持任务链式调用。这些方法允许你将一组操作链接在一起,形成一个任务链,每一个任务只有在上一个任务成功完成后才会被执行。现在,我们来看一下一些常用的链接任务的方法:thenApply():这个方法可以接收一个Function实例,用来处理......